IB を使用するのはこれが初めてですが、1 日か 2 日親密に過ごした後、IB を理解し始めていると思います。これは、ここで簡単なことを見落としている可能性があるという私の言い方です。
UIPickerView をセットアップし、IB の DataSource および Delegate オブジェクトに結合しました (私の場合は両方とも異なるクラスです)。これにより、アプリを実行したときにピッカーが表示されるようになります。これは、以前のテスト実行で表示されていなかった場合に非常に心強いものです。;) しかし、UIPickerView をスクロールすると、プログラムがクラッシュし、バックトレースで参照されているコードが見つかりません。かなりのトラブルシューティングを行った後、バックトレースに関する限り、クラッシュを 2 つの異なるケースに絞り込んだと思います。
-pickerView:numberOfRowsInComponent の戻り値: > 表示される行数
- 新しい行を選択するモーションが開始されるとすぐにアプリがクラッシュする
- -selectRow:inComponent:animated: を使用しようとすると、アプリがクラッシュします。
バックトレース (メインを無視):
#0 0x955e8688 in objc_msgSend ()
#1 0x0167bea8 in -[UIPickerView table:cellForRow:column:reusing:] ()
#2 0x016773c1 in -[UIPickerView table:cellForRow:column:] ()
#3 0x017fef53 in -[UITable createPreparedCellForRow:column:] ()
#4 0x018077c8 in -[UITable _updateVisibleCellsNow] ()
#5 0x018027cf in -[UITable layoutSubviews] ()
#6 0x03ac42b0 in -[CALayer layoutSublayers] ()
#7 0x03ac406f in CALayerLayoutIfNeeded ()
#8 0x03ac38c6 in CA::Context::commit_transaction ()
#9 0x03ac353a in CA::Transaction::commit ()
#10 0x03acb838 in CA::Transaction::observer_callback ()
#11 0x007b8252 in __CFRunLoopDoObservers ()
#12 0x007b765f in CFRunLoopRunSpecific ()
#13 0x007b6c48 in CFRunLoopRunInMode ()
#14 0x000147ad in GSEventRunModal ()
#15 0x00014872 in GSEventRun ()
#16 0x0168a003 in UIApplicationMain ()
-pickerView:numberOfRowsInComponent の戻り値: < 表示される行数
- モーションが停止して行が選択されると、アプリがクラッシュする
- -selectRow:inComponent:animated: を使用しようとしても、アプリはクラッシュしません。
バックトレース (メインを無視):
#0 0x955e8688 in objc_msgSend ()
#1 0x0167700d in -[UIPickerView _sendSelectionChangedForComponent:] ()
#2 0x017f4187 in -[UIScroller _scrollAnimationEnded] ()
#3 0x016f732c in -[UIAnimator stopAnimation:] ()
#4 0x016f7154 in -[UIAnimator(Static) _advance:] ()
#5 0x00017739 in HeartbeatTimerCallback ()
#6 0x007b7ac0 in CFRunLoopRunSpecific ()
#7 0x007b6c48 in CFRunLoopRunInMode ()
#8 0x000147ad in GSEventRunModal ()
#9 0x00014872 in GSEventRun ()
#10 0x0168a003 in UIApplicationMain ()
私のデリゲートとデータソースの実装は次のとおりです。
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return (NSInteger)3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return (NSInteger)4;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
//it will probably be better to use the method following when creating the rows, so I can better customize it
return @"strings";
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSLog(@"selected a row");
}