2013-10-18 43 views
0

我是使用UIKit的初學者。當我厭倦了iOS 7 SDK中的UIPickerView工作時,我遇到了一個難以解決的問題。與UIPickerView一起使用BAD_ACCESS&NSInvalidArgumentException

我們知道UIPickerView需要兩個資源才能完美工作:dataSource & delegate。所以我寫了一個名爲「KMPickerProtocols」的類。我通過它到UIPickerViewDataSource & UIPickerViewDelegate協議,然後我添加了一些額外的setter方法。

KMPickerProtocols被採用到dataSource的所有基本方法和委託Protocols +必要的可選方法設置每行的標題(pickerView:titleForRow:forComponent)。所有這些方法在沒有任何問題的情況下完成任務(在正常情況下)。

最後,我用這段代碼手動設定UIPickerView(名爲_accountPicker)的代表且dataSource屬性:

NSArray *delegateAgent = [[KMTwitterDelegate new] run ]; 
_accountPicker.dataSource = [delegateAgent objectAtIndex:0]; 
_accountPicker.delegate = [delegateAgent objectAtIndex:1] ; 

(運行方法被設計爲設置一些特性,包括每行的高度和。 ..)

現在,當我運行我的應用程序時,它將以UIPickerView的形式顯示存儲在系統(帳戶框架)中的我的twitterAccounts。但存在這樣的問題:當我滾動選擇器視圖或點擊任何行,該程序將崩潰,我在這行代碼得到BAD_ACCESS(代碼= 2,地址=爲0x1):

@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([KMAppDelegate class])); 
} 

有時候我會在上面得到SIGABRT信號。在這些情況下,日誌說:

終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是: ' - [NSMallocBlock pickerView:titleForRow:forComponent:]:無法識別的選擇發送到實例0x8c75ad0'

如果你能幫我解決這個問題,我將不勝感激。我真的不知道錯誤在哪裏。但我想這個屏幕快照將有助於發現:

First implementation of method Second implementation Third implementation

在上面的截圖中的問題是,UIPicker稱爲「pickerView:forComponent:titleForRow」爲0排法,三次而不是一次。我只是不知道這是因爲myFault還是因爲UIPicker的典型行爲。

回答

0

您正在將消息pickerView:titleForRow:forComponent:發送給NSMallocBlock類型的對象。這是從選擇器自動發送到它的數據源的消息,所以我的假設是,要指定數據源:

_accountPicker.dataSource = [delegateAgent objectAtIndex:0]; 

分配不符合協議UIPickerViewDataSource

結帳的數據源是什麼返回[delegateAgent objectAtIndex:0];和確保它是你期望的。

+0

謝謝。我檢查過它,這正是我的預期。並且在第一次運行應用程序時,沒有問題,但是當您使用選擇器時,會發生這些不好的事情。 – kaymas