从 UIViewController 调用自定义 UINavigationController 中的方法时目标错误

Posted

技术标签:

【中文标题】从 UIViewController 调用自定义 UINavigationController 中的方法时目标错误【英文标题】:Wrong target when calling method in custom UINavigationController from UIViewController 【发布时间】:2015-12-31 22:09:31 【问题描述】:

我创建了一个 UINavigationController 的子类,并在导航栏中放置了一个 UIBarButtonItem。代码如下:

SharedNavigationController.swift

func showNextButton(nc: UINavigationController) 
    print(nc)
    let nextButton = UIBarButtonItem(title: "Next", style: UIBarButtonItemStyle.Plain, target: nc, action: "next")
    print(nextButton.target)
    self.navigationBar.topItem?.rightBarButtonItem = nextButton

但是,我遇到了点击按钮时目标错误的问题。目标不是导航控制器(创建它的类),而是导航控制器中的当前视图控制器。结果,我收到以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[App.SignupBasicInfoForm next]: 无法识别的选择器发送到实例 0x7af7d0c0'

我最初将目标设置为“self”,但它引用的是导航控制器中的视图控制器,而不是导航控制器本身。我也尝试将目标设置为self.navigationController,效果相同。最后,我将SharedNavigationController 的实例显式传递给showNextButton 方法,如上面的代码所示。打印语句给了我这个:

print(nc): <App.SharedNavigationController: 0x7d41f800>
print(nextButton.target): Optional(<App.SharedNavigationController: 0x7d41f800>)

所以至少在SharedNavigationController,目标是正确的。但是当从导航控制器内的当前视图控制器点击按钮时,目标似乎已经改变。我上面尝试的没有奏效。如何为按钮指定正确的目标,而无需从视图控制器而不是导航控制器定义方法或设置栏按钮项?

【问题讨论】:

【参考方案1】:

你可能需要在你的子类中重写这个函数来做你想做的事

override func pushViewController(viewController: UIViewController, animated: Bool) 
    viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: UIBarButtonItemStyle.Plain, target: nc, action: "next")
    super.pushViewController(viewController, animated: animated)

【讨论】:

以上是关于从 UIViewController 调用自定义 UINavigationController 中的方法时目标错误的主要内容,如果未能解决你的问题,请参考以下文章

无法从自定义 UIView 调用按钮的方法

从邮件中打开自定义文件后调用哪种方法

从 UIViewController 类中隐藏自定义视图 UIButton

从 UIViewController 中删除我的自定义 MKMapView

从 UIViewController 将变量传递给自定义 UITableViewCell

从 Tableview 自定义单元格翻转过渡到 UIViewController