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`.
}
}
应该就是这样!
我在实例化自定义视图控制器时遇到了麻烦。
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`.
}
}
应该就是这样!