从 xib 文件中的操作按钮推送另一个 Viewcontroller

Posted

技术标签:

【中文标题】从 xib 文件中的操作按钮推送另一个 Viewcontroller【英文标题】:Push another Viewcontroller from action button in xib file 【发布时间】:2016-10-14 11:43:54 【问题描述】:

我有一个来自.xib 的视图控制器。 .xib 里面有一个按钮;我希望按钮将视图控制器推送到另一个视图控制器 (ViewControllerPeopleNew)。

我使用操作按钮:

@IBAction func _hitPeople(sender: AnyObject) 
    let mapViewControllerObejct = self.storyboard?.instantiateViewControllerWithIdentifier("peoplenew") as? ViewControllerPeopleNew
    self.navigationController?.pushViewController(mapViewControllerObejct!, animated: false)

但出现错误:

信号 SIGABRT 无法识别的选择器发送到实例

我已经检查了有关名称标识符 viewcontroller 的所有内容,一切正常。

【问题讨论】:

尝试打印你的navigationController,确保它不为空 函数名不要以_开头。 首先,从 xib 实例化的视图控制器不属于任何情节提要。所以它的 self.storyboard 为 nil,这意味着它不能从故事板实例化视图控制器,因为它不知道任何东西。 如何处理? @Adeel 函数名以_开头还是@matt没有区别 【参考方案1】:

从带有 XIB 的视图控制器中,您无法在代码下方使用故事板

@IBAction func _hitPeople(sender: AnyObject) 

let storyboard = UIStoryboard(name: "storyboadname", bundle: nil)
let mapViewControllerObejct = storyboard.instantiateViewControllerWithIdentifier("peoplenew") as? ViewControllerPeopleNew
self.navigationController?.pushViewController(mapViewControllerObejct!, animated: false)

【讨论】:

【参考方案2】:

永远记住,当两个视图控制器 (To and From view controllers) 属于同一个 storyboard 时,您只能使用 self.storyBoard 来实例化视图控制器。如果没有,那么您需要首先获取对您的To view controller 所属的storyboard 的引用。所以你需要这样做:

@IBAction func _hitPeople(sender: AnyObject) 
    let stotyboard = UIStoryboard(name: "YourStoryboard", bundle: nil)
    let mapViewControllerObejct = storyboard?.instantiateViewControllerWithIdentifier("peoplenew") as? ViewControllerPeopleNew
    self.navigationController?.pushViewController(mapViewControllerObejct!, animated: false)

PS:请确保您的 From view controller 在导航堆栈中,即 self.navigationController 不是 nil

【讨论】:

以上是关于从 xib 文件中的操作按钮推送另一个 Viewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中按下按钮从另一个xib文件加载另一个xib文件

推送控制器无法从情节提要中的嵌入式 xib 工作

如何以编程方式从 iOS Swift 3 中的 XIB 推送和呈现给 UIViewController

如何推送查看控制器表单呈现的 xib

从按钮按下加载xib

以编程方式从 Xib 执行 Segue