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