gpt4 book ai didi

xcode - Storyboards 和 Swift 2.2 Mac App 自定义 segue 替换 View Controller

转载 作者:行者123 更新时间:2023-11-28 06:46:08 28 4
gpt4 key购买 nike

我是 Swift 的新手,虽然我有一些编程知识并且看过 Udemy 和 Lynda 的 Swift 代码,但我在从 playground 转移到 Xcode Project 上遇到了一些困难。

我还想创建一个 Mac 应用程序,这使得查找教程变得更加困难。

我也想使用最新的 Swift 和 Storyboards,我想对其进行可视化布局,WWDC 建议 Storyboards 是新 Mac 应用程序的最佳实践,Lister 就是一个很好的例子。

我可以愉快地创建一个按钮并在 View 之间使用 segue 移动,但我不想要弹出窗口、模态窗口或工作表,但实际上要替换 View (也就是留在同一窗口中)所以我认为这是一个自定义序列或仅编程连接,这是我遇到的问题没有多少简单的教程涵盖 Mac 应用程序,他们在讨论 Storyboards 时都转移到 iOS。如果有人能提供帮助,那就太好了我已经创建了我的第二个 ViewController,我相信这是支持它的代码,我已经将它连接到属性中的第二个 ViewController

import Cocoa

class CreateEditView: NSViewController {

required init?(coder: (NSCoder!)) {
super.init(coder:coder)
}

}

同样,这些示例似乎有所不同,但可能不是 swift 2.2(如果有人也能解释这段代码实际上在做什么,那也很好)

最佳答案

我已经在 Objective-C 中完成了这种类型的自定义转场,但这并不容易……而且正确设置约束更糟糕。在 Apple 发现 View Controller 不一定需要它们自己的窗口之前,我建议使用容器 View 。

对于这个例子,我用一个容器 View 设置了 ViewController,并在 Storyboard中将一个 FirstContained View Controller 链接到它。它有一个“下一步”按钮。

@IBAction func goToNext(sender: NSButton) {
NSNotificationCenter.defaultCenter().postNotificationName(ViewController.SecondController, object: nil)
}

我在 Storyboard中创建了一个 SecondContained View Controller ,并为其指定了标识符“second_contained”。它有一个“后退”按钮。

@IBAction func goBack(sender: NSButton) {
NSNotificationCenter.defaultCenter().postNotificationName(ViewController.FirstController, object: nil)
}

ViewController 完成所有的转换工作。 (请注意,获得正确的约束仍然需要一些努力。首先在 SecondContained 的 View 中减少压缩阻力。)

import Cocoa

class ViewController: NSViewController {

static let FirstController = "FirstController"
static let SecondController = "SecondController"

@IBOutlet weak var container: NSView!

override func viewDidLoad() {
super.viewDidLoad()

NSNotificationCenter.defaultCenter().addObserver(self, selector: "firstSelected:", name: ViewController.FirstController, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "secondSelected:", name: ViewController.SecondController, object: nil)

// This puts the "SecondContained" controller at location zero in the childViewControllers array.
let storyboard = NSStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateControllerWithIdentifier("second_contained") as? SecondContained
if let second = controller {
addChildViewController(second)
}
}

deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}

func removePreviousView() {
if let oldView: NSView = container.subviews[0] {
oldView.removeFromSuperview()
} else {
print("No previous view found")
}
}

// This is a hack.
// It would be better to search for the controller by a reliable identifier rather than a number.
func useController(offset: Int) {
guard childViewControllers.count > offset else {
print("Bad offset \(offset) for \(childViewControllers.count)-long array")
return
}
if let controller: NSViewController = childViewControllers[offset] {
container.addSubview(controller.view)
} else {
print("No view controller!?")
}
}

func firstSelected(notification: NSNotification) {
removePreviousView()
useController(1)
}

func secondSelected(notification: NSNotification) {
removePreviousView()
useController(0)
}

}

请注意,这是 Swift 2.1。逻辑应该是可移植的,但我不知道某些语法是否发生了变化。

关于xcode - Storyboards 和 Swift 2.2 Mac App 自定义 segue 替换 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36306359/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com