0

私はUIKitの初心者です。iOS 7 SDK で UIPickerView を使用するのに疲れたとき、解決が困難な問題に直面しました。

UIPickerView が完全に機能するには、dataSource と delegate という 2 つのリソースが必要であることがわかっています。そこで、「KMPickerProtocols」という名前のクラスを作成しました。UIPickerViewDataSource および UIPickerViewDelegate プロトコルに採用し、いくつかのセッター メソッドを追加しました。

KMPickerProtocols は、dataSource およびデリゲート プロトコルの必須メソッドのすべてと、各行のタイトルを設定するために必要なオプション メソッド (pickerView:titleForRow:forComponent) に採用されています。これらの方法はすべて問題なく完了します (通常の状況では)。

最後に、次のコードを使用して、UIPickerView (_accountPicker という名前) のデリゲート プロパティと dataSource プロパティを手動で設定します。

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

( run メソッドは、各行の高さを含むいくつかのプロパティを設定するように設計されています...)

ここで、アプリを実行すると、システム (アカウント フレームワーク) に保存されている twitterAccounts が UIPickerView の形式で表示されます。しかし、問題があります: ピッカー ビューをスクロールするか、任意の行をタップするとすぐに、プログラムがクラッシュし、次のコード行で BAD_ACCESS (code=2 , address = 0x1) を取得します。

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

また、上記の行でシグナル SIGABRT を受け取ることもあります。これらの状況では、ログは次のように述べています。

キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[ NSMallocBlock pickerView:titleForRow:forComponent:]: 認識されないセレクターがインスタンス 0x8c75ad0 に送信されました'

この問題に対処するのを手伝っていただければ幸いです。バグがどこにあるのか本当にわかりません。しかし、このスクリーンショットは次のことを見つけるのに役立つと思います:

メソッドの最初の実装 2 回目の実装 3 番目の実装

上のスクリーンショットの問題は、UIPicker が行 0 に対して「pickerView:titleForRow:forComponent」メソッドを 1 回ではなく 3 回呼び出したことです。これが myFault によるものなのか、それとも UIPicker の典型的な動作によるものなのかはわかりません。

4

1 に答える 1

0

pickerView:titleForRow:forComponent:タイプ のオブジェクトにメッセージを送信していますNSMallocBlock。これは、ピッカーからそのデータソースに自動的に送信されるメッセージなので、データソースを割り当てていると仮定します。

_accountPicker.dataSource = [delegateAgent objectAtIndex:0];

割り当てたデータソースはプロトコルに準拠していませんUIPickerViewDataSource

返されるものをチェックアウトし[delegateAgent objectAtIndex:0];、それが期待どおりであることを確認してください。

于 2013-10-18T11:40:06.937 に答える