如何在Swift(MVC)中引用控制器

时间:2015-03-02 07:32:56

标签: macos cocoa swift

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

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

大多数教程都不会这样做,并假设每个人都希望使用@IBOutlets从AppDelegate访问控件的属性。

我知道你可以使用segues(prepareForSegue) - 但我的应用程序没有使用故事板,我想更好地理解cocoa中的MVC实现。

1 个答案:

答案 0 :(得分:0)

任何对象都可以拥有自己的控制器。 AppDelegate不是圣杯,它只是一个实现UIApplicationDelegate协议方法的对象。它不是您可能希望连接的所有通用交换机。

一些教程通过使用AppDelegate作为一个快速而讨厌的地方放置东西来启动Cocoa dev很大的伤害。对于故事板应用程序,所有需要包含在符合NSApplicationDelegate

的类中
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

}

即没有。

标称模式是一个屏幕有一个控制器但是当使用嵌入模式控制一个窗口内的子视图时,即使这样也不是真的。但请考虑简单的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中,并将其作为文本字段的委托。在构造视图控制器时,您可以将文本字段传递给管理器类。

假设的TextFieldInteractionManager可能会在ViewController实例的设置过程中在本地创建或注入,即prepareForSegue(segue: NSStoryboardSegue, sender sender: AnyObject?)。可能性各不相同,取决​​于您的应用程序的范围以及您希望如何管理您的参考。

我常用的模式是有一个 Root 视图控制器,它将引用传递给链中的下一个控制器。 YMMV

Dependancy Injection是一个很好的模式。

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

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