iOS 故事板:无法正确实例化视图控制器

iOS Storyboard: Not able to instantiate view controller properly

我在实例化自定义视图控制器时遇到了麻烦。

This 是我的故事板设置。第三个视图控制器是我要展示的那个。

这两种方法我都试过了。

1:这导致黑屏。

var searchController: SearchController = SearchController()
self.presentViewController(searchController, animated: true, completion: nil)

2:这会弹出一个白色的空视图控制器。

let mainStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let searchController : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("searchController") as! UIViewController
self.presentViewController(searchController, animated: true, completion: nil)

下面是实际视图控制器的代码:

class SearchController: UIViewController {

    lazy var searchBar: UISearchBar = UISearchBar(frame: CGRectMake(0, 0, 200, 20))

    override func viewDidLoad() {
        super.viewDidLoad()

        var leftItem = (UIBarButtonItem)(customView: searchBar)
        self.title = "Search"
        self.navigationItem.leftBarButtonItem = leftItem
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }    
}

这非常令人困惑,因为在使用上面的方法 #1 时,我的另一个自定义视图控制器被正确显示。为什么它不适用于此控制器?

非常感谢大家。

使用故事板时,您不需要使用 presentViewController 或手动实例化您的视图控制器。相反,最好使用 segue 从一个 UIViewController 移动到下一个

1. 在你的情况下,你想要一个 show segue,看起来你已经完成了故事板的判断.

2. 你需要给你的 segue 一个 Identifier 你可以通过选择你的 segue 并转到 Attributes Editor

3. 要执行您的 segue,只需从您的第一个视图控制器调用以下命令(而不是 presentViewController)。

self.performSegueWithIdentifier("YourIdHere", sender: self)

这将导致故事板实例化您的 SearchViewController 并以您为该 segue 定义的方式呈现它。

4. 如果您想将任何值传递给您的 SearchViewController,您可以覆盖 UIViewController 中的 prepareForSegue。在您的第一个视图控制器中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let searchViewController = segue.destinationViewController where segue.identifier == "YourIdHere") {
        // Now you can set variables you have access to in `searchViewController`.
    }
}

应该就是这样!