私が現在取り組んでいるシングルビュー iOS アプリには、オーディオ ストリームの再生を管理するように設計されたビュー コントローラーと、再生コントロール、スクロールなどのための一連の UI 要素があります。明確にするために、それを と呼びますAudioStreamerViewController
。
このビューの「トラック選択」ボタンは、呼び出されたTrackSelectionTableViewController
ときにユーザーがトラックを選択して再生ビューに戻ることを意図して、モーダルにアクション表示に接続されていますtableView:didSelectRowAtIndexPath:
。
この行選択メソッドが起動すると、目的はデリゲート コールバック メソッドにメッセージを送信し、AudioStreamerViewController
実行を試みることself.currentTrack = trackObjPassedToCallback
です。
問題はAudioStreamerViewController
、そのcurrentTrack
セッターを一見無限回呼び出すことです (「シミュレーターを停止する必要があるか、メモリが不足する」回数のように)、その理由を理解できないようです。 コールスタックのスクリーンショットを撮りました。ブレークポイントが設定されていたので、画像には 7 つの呼び出ししか表示されていませんが、信じてください、続行します =)
次のプロトタイプを使用して のデリゲートを作成AudioStreamerViewController
することにより、2 つの ViewController を配線しています。TrackSelectionTableViewController
// in TrackSelectionTableViewController.h
@interface TrackSelectionTableViewController : UITableViewController {
NSMutableArray *tracks;
}
@property (nonatomic, assign) id<TrackSelectionTableViewControllerDelegate> delegate;
@protocol
// in TrackSelectionTableViewController.m
@synthesize delegate;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Track *trackSelected = [tracks objectAtIndex:[indexPath row]];
[self.delegate userDidSelectTrackFromTableView:trackSelected ];
[self dismissModalViewControllerAnimated:YES];
}
AudioStreamerViewController
のプロトタイプとデリゲートのコールバックは次のようになります。
// in AudioStreamerViewController.h
@interface AudioStreamerViewController : UIViewController <SCDJTrackSelectionViewControllerDelegate> {
Track *currentTrack;
}
@property (nonatomic) Track *currentTrack;
-(void)userDidSelectTrackFromTableView:(id)trackObj;
// in AudioStreamerViewController.m
@synthesize currentTrack;
-(void)userDidSelectTrackFromTableView:(id)trackObj
{
self.currentTrack = (Track *)trackObj;
// other handling code...
}
私はこれをいくつかの方法で実行しようとしましたが、それぞれの方法で同じ最終結果が得られます。なぜこれが起こっているのかを示す兆候を特定できる人はいますか? また、このアイデアを実装するためのより魅力的で安定したアプローチはありますか? もしそうなら、どのような利点がありますか?