使用情节提要或以编程方式创建视图时自定义初始化

时间:2015-09-23 21:50:04

标签: xcode swift uiviewcontroller subclass init

我正在尝试创建UIViewController的子类,然后通过故事板或以编程方式将数据传递给它。我到目前为止尝试的是有一个subViewController swift文件和一个类subViewController,它是一个UIViewController

import UIKit

class subViewController: UIViewController {

    var s1 = String()

    init(myString: String) {

        self.s1 = myString
        super.init(nibName: nil, bundle: nil)
    }

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

    @IBOutlet var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        print(self.s1)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

然后在Identity Inspector中将其连接到视图控制器

和AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let SubVC = subViewController(myString: "Komic")

    self.window?.rootViewController = SubVC

    self.window?.makeKeyAndVisible()
    return true
}

这会加载黑屏,但会注销myString。据我所知,它并没有创建视图,但它只是创建了类的实例,这就是为什么它给了我黑屏。我也知道这部分

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

在故事板为您提供视图时运行。但我无法在那里传递数据,这就是为什么我要尝试这样做的程序。有可能以某种方式这样做吗?我知道我可以用故事板实例化一个标识符,但是我找不到通过那个传递数据的方法....任何帮助?

2 个答案:

答案 0 :(得分:2)

解决此问题的一种(丑陋)方法:

您可以在代码中设置var s1来自外部缓冲区(本例中为AppDelegate变量)

required init?(coder aDecoder: NSCoder) {
    self.s1 = UIApplication.shared().delegate.bufferForS1

    super.init(coder: aDecoder)
}

当您通过Storyboard启动UIViewController时:

UIApplication.shared().delegate.bufferForS1 = myS1Value
self.navigationController!.pushViewControllerFading(self.storyboard!.instantiateViewController(withIdentifier: "myViewControllerID") as UIViewController)

答案 1 :(得分:-1)

当您调用自定义初始化程序时,您没有从故事板加载视图控制器,如果您创建客户初始化程序,则您有责任以编程方式创建视图层次结构 - 通常在loadView()中,尽管很多人在viewDidLoad中执行此操作()。

为了加载您在故事板中定义的视图层次结构,您可以执行以下操作:

let storyBoard = UIStoryboard(name: "storyboardName", bundle: NSBundle.mainBundle())
let viewController = storyBoard.instantiateViewControllerWithIdentifier("storyboardId")

您可以在身份检查器中定义视图控制器的故事板ID