2016-04-20 62 views
1

該應用程序有一個屏幕,在給出輸入後,我點擊確定按鈕,它應該執行輸入驗證,如果沒問題,則導航並通過協議/委託將數據傳回到前一屏幕,否則,阻止導航並顯示警告彈出窗口。帶按鈕點擊檢測的NSInvalidArgumentException

這是我的viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    button.addTarget(self, action: "pushView:", forControlEvents: .TouchUpInside) 
} 

這是pushView()函數:

func pushView() { 
    //some codes to validate data and perform navigation 
} 

當我運行在模擬器的應用程序,當我點擊按鈕崩潰,這是錯誤消息:

2016-04-21 00:12:39.976 ToDo List[1795:1253192] - 
[ToDo_List.AddReminderController pushView:]: 
unrecognized selector sent to instance 0x7fa13ac16c40 
2016-04-21 00:12:39.981 ToDo List[1795:1253192] 
*** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '- 
[ToDo_List.AddReminderController pushView:]: 
unrecognized selector sent to instance 0x7fa13ac16c40' 

發件人或選擇器可能存在問題,但我不知道它到底意味着什麼。

回答

0

當您添加:像你這樣的選擇/動作名稱這裏:

button.addTarget(self, action: "pushView:", forControlEvents: .TouchUpInside)

這意味着,你的選擇需要一個參數。

另一方面,你的pushView()功能,不包括任何參數,所以對於iOS/UIKit你引用了兩個不同的東西。

的解決方案是:

  • 無論是從您的action刪除:像這樣:

button.addTarget(self, action: "pushView", forControlEvents: .TouchUpInside)

  • 或參數添加到您的pushView()功能如下所示:

func pushView(sender: AnyObject)

+0

非常感謝您的解釋!我對Swift非常陌生。 –

+0

不客氣。選擇器有一個奇怪的語法,直到你理解它。這個答案更多地討論了選擇器和它們的語法:http://stackoverflow.com/a/6404439/4063602。正如@ oleg-gordiichuk在他的回答中提到的那樣,Swift 2.2中的語法已經發生了變化,所以您可以編寫'#selector'並使用代碼幫助來幫助您選擇正確的方法。這可能是因爲很多人遇到了像以前那樣的「老」選擇器語法問題(而且我也有過) – pbodsk

0

修復選擇:

button.addTarget(self, action: "pushView", forControlEvents: .TouchUpInside) 

對於未來記得最新SWIFT 2.2語法有一些這方面的差異。

button.addTarget(self, action: #selector(MyClass.pushView), forControlEvents: .TouchUpInside)