从 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 中的方法时目标错误的主要内容,如果未能解决你的问题,请参考以下文章
从 UIViewController 类中隐藏自定义视图 UIButton
从 UIViewController 中删除我的自定义 MKMapView