gpt4 book ai didi

macos - 如何在 Swift (MVC) 中引用 Controller

转载 作者:行者123 更新时间:2023-11-28 09:12:26 25 4
gpt4 key购买 nike

我有一个单窗口应用程序。目前我有一个 xib 文件 (MainMenu.xib) 和一个 .swift 文件 (AppDelegate)。

如果我想向 UI 添加控件并将特定 Controller 分配给其中一些 UI 组件以在单独的文件中处理其他功能,例如带有 TextViewController 的 NSTextView - 我如何从我的 AppDelegate 中获取对 TextViewController 的引用?

大多数教程在此止步并假设每个人都想使用@IBOutlets 从 AppDelegate 访问控件的属性。

我知道您可以使用 segues (prepareForSegue) - 但我的应用程序没有使用 Storyboard,我想更好地了解 cocoa 中的 MVC 实现。

最佳答案

任何对象都可以有自己的 Controller 。 AppDelegate 不是 chalice ,它只是一个实现 UIApplicationDelegate 协议(protocol)中的方法的对象。它不是您可能希望连接的所有东西的通用配电盘。

一些教程通过将 AppDelegate 用作放置东西的快速而讨厌的地方,对启动 Cocoa 开发造成了极大的损害。对于 Storyboard应用程序,这一切都需要包含在符合 NSApplicationDelegate

的类中
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

}

即什么都没有。

名义上的模式是一个屏幕有一个 Controller ,但当您使用嵌入模式控制一个窗口中的 subview 时,即使这样也不是真的。然而,请考虑简单的 Cocoa Application 项目模板

enter image description here

ViewController 类是 NSViewController 的子类,您可以在其中将 IBOutlet 放置到您的 NSTextView 以及在该上下文中与它交互的一些逻辑。

import Cocoa

class ViewController: NSViewController,NSTextDelegate {

@IBOutlet var textView: NSTextView!

override func viewDidLoad() {
super.viewDidLoad()

configureTextController()
}

var textController:TextFieldInteractionManager!
func configureTextController() {
//textcontroller can be local var , alternatively inject it into this VC
textController = TextFieldInteractionManager(textView)
}


}

如果您想要在整个项目中进行特定的交互,您可能希望将它们放在另一个类中,例如 TextFieldInteractionManager 并使其成为文本字段的委托(delegate)。在构造 View Controller 时,您会将文本字段传递给管理器类。

假设的 TextFieldInteractionManager 可能在本地创建或在 ViewController 实例设置期间注入(inject),即 prepareForSegue(segue: NSStoryboardSegue, sender sender: AnyObject?) 。可能性多种多样,取决于您的应用程序的范围以及您希望如何管理您的引用资料。

我常用的模式是有一个 Root View Controller ,它将引用向下传递到链中的下一个 Controller 。 YMMV

Dependancy Injection是一个值得了解的好模式。

Massive View Controller是一个很好的反模式,需要了解和避免。

这就是我说去获取一些领域知识时的意思。它是一个不断扩展的东西树,需要了解以及为什么你的问题本身不适合 SO。

关于macos - 如何在 Swift (MVC) 中引用 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804653/

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