尝试添加 UInavigationBar 按钮时发生崩溃
Posted
技术标签:
【中文标题】尝试添加 UInavigationBar 按钮时发生崩溃【英文标题】:Crash occurs when trying to add UInavigationBar button 【发布时间】:2017-08-08 08:48:10 【问题描述】:我正在尝试以编程方式将右侧导航栏按钮项添加到视图中,我使用的代码如下:
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: Selector(("buttonTapped:")))
self.navigationItem.rightBarButtonItem = button
点击添加的右栏按钮的响应函数如下:
func buttonTapped()
print("Right Bar button action")
当我尝试运行项目时,新添加的右栏按钮出现在导航栏上。但是当我点击它时,出现以下错误并且应用程序崩溃。
2017-08-08 12:37:26.641 Grow[14229:3786869] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Grow.DashBoardViewControllerMain rightButtonAction:]: unrecognized selector sent to instance 0x7fd719c12700'
*** First throw call stack:
(
0 CoreFoundation 0x00000001101c2b0b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000011317c141 objc_exception_throw + 48
2 CoreFoundation 0x0000000110232134 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 CoreFoundation 0x0000000110149840 ___forwarding___ + 1024
4 CoreFoundation 0x00000001101493b8 _CF_forwarding_prep_0 + 120
5 UIKit 0x00000001113e4d82 -[UIApplication sendAction:to:from:forEvent:] + 83
6 UIKit 0x000000011181f917 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 149
7 UIKit 0x00000001113e4d82 -[UIApplication sendAction:to:from:forEvent:] + 83
8 UIKit 0x00000001115695ac -[UIControl sendAction:to:forEvent:] + 67
9 UIKit 0x00000001115698c7 -[UIControl _sendActionsForEvents:withEvent:] + 450
10 UIKit 0x0000000111569a3b -[UIControl _sendActionsForEvents:withEvent:] + 822
11 UIKit 0x0000000111568802 -[UIControl touchesEnded:withEvent:] + 618
12 UIKit 0x00000001114527ea -[UIWindow _sendTouchesForEvent:] + 2707
13 UIKit 0x0000000111453f00 -[UIWindow sendEvent:] + 4114
14 UIKit 0x0000000111400a84 -[UIApplication sendEvent:] + 352
15 UIKit 0x0000000111be45d4 __dispatchPreprocessedEventFromEventQueue + 2926
16 UIKit 0x0000000111bdc532 __handleEventQueue + 1122
17 CoreFoundation 0x0000000110168c01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
18 CoreFoundation 0x000000011014e0cf __CFRunLoopDoSources0 + 527
19 CoreFoundation 0x000000011014d5ff __CFRunLoopRun + 911
20 CoreFoundation 0x000000011014d016 CFRunLoopRunSpecific + 406
21 GraphicsServices 0x000000011646ca24 GSEventRunModal + 62
22 UIKit 0x00000001113e3134 UIApplicationMain + 159
23 Grow 0x000000010f32f5a7 main + 55
24 libdyld.dylib 0x0000000114e3665d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
谁能帮我解决问题?
【问题讨论】:
#selector("buttonTapped:") 冒号 ":" 在函数中有额外参数时使用。但是你的函数中没有。 让 button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector(buttonTapped)) self.navigationItem.rightBarButtonItem = button 【参考方案1】:在代码中
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: Selector(("buttonTapped")))
self.navigationItem.rightBarButtonItem = button
func buttonTapped()
print("Right Bar button action")
崩溃报告未找到操作 rightButtonAction
:。
请重新检查并将rightButtonAction
: 替换为buttonTapped
,其中buttonTapped
是self
上的一个方法。
【讨论】:
【参考方案2】:你的选择器需要一个有参数的函数。虽然您的功能没有。
考虑到您使用的是 Swift 2,请编写如下所示的函数。
func buttonTapped(sender: UIBarButtonItem)
print("Right Bar button action")
如果使用 swift 3 则编写 selector 如下所示
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector(Your_View_Controller.buttonTapped(_ :)))
和写函数喜欢
func buttonTapped(_ sender: UIBarButtonItem)
print("Right Bar button action")
【讨论】:
【参考方案3】:let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector(buttonTapped(button:)))
self.navigationItem.rightBarButtonItem = button
func buttonTapped(button: UIBarButtonItem)
print("bar button taped")
【讨论】:
请添加触发错误的描述以及解决方法。【参考方案4】:您的buttonTapped
函数没有使用任何参数。所以你不需要使用:
(冒号)
尝试删除它,看看它是否有效。
【讨论】:
【参考方案5】:您可以使用以下内容:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Button", style: .plain, target: self, action: #selector(buttonTapped))
而不是这两行:
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: Selector(("buttonTapped:")))
self.navigationItem.rightBarButtonItem = button
【讨论】:
【参考方案6】:看看这一行:
action: Selector(("buttonTapped:"))
如果引用了一个名为 buttonTapped:
的选择器。
但是,您的函数被命名为buttonTapped
,没有参数。相应地修改您的选择器,因此它将采用UIBarButtonItem
参数。
另一方面,您应该使用#selector(functionName)
,因为它具有实时名称检查功能,并且可以警告您缺少功能。
let button = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(buttonTapped(_:))))
self.navigationItem.rightBarButtonItem = button
func buttonTapped(_ sender: UIBarButtonItem)
print("Right bar button action")
【讨论】:
我已经修改了问题,因为有一些打字错误...请再看一遍.. @JobinsJohn 我修改了我的答案。【参考方案7】:发生错误是因为您在选择器文本中设置了“:”。这意味着您在函数(发送者)中等待参数,但您的函数没有参数。 (并且在运行时系统中找不到函数)您可以尝试删除“:”符号或在函数中添加发送者参数。我想写这样的东西
let button = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector(buttonTapped))
self.navigationItem.rightBarButtonItem = button
功能:
func buttonTapped(_ sender: UIBarButtonItem)
print("Right Bar button action")
【讨论】:
以上是关于尝试添加 UInavigationBar 按钮时发生崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationBar 左侧的“返回”按钮旁边添加另一个按钮