UITableView在rowselect上多次设置parentView属性

时间:2012-08-29 01:57:44

标签: objective-c ios cocoa-touch user-interface

在我目前正在开发的单视图iOS应用程序中,我有一个用于管理音频流播放的视图控制器,以及一系列用于播放控制,滚动等的UI元素...为清楚起见,我们称之为AudioStreamerViewController

此视图中的“曲目选择”按钮连接到动作以模式方式显示TrackSelectionTableViewController,目的是允许用户选择曲目并在tableView:didSelectRowAtIndexPath:获取时返回播放视图调用。
当此行选择方法触发时,目标是在AudioStreamerViewController中向委托回调方法发送消息,然后尝试执行self.currentTrack = trackObjPassedToCallback

问题是AudioStreamerViewController调用它的currentTrack setter看似无限多次(比如“我必须停止模拟器或者我的内存耗尽”次数),以及我似乎无法弄清楚为什么。调用堆栈的I took a screenshot。它有一个断点设置,所以它只显示图像中的七个调用,但相信我,它会继续=)

我通过使用以下原型AudioStreamerViewController TrackSelectionTableViewController委托来连接两个ViewControllers:

// 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...
}

我尝试过多种方式,并且每个方法产生相同的最终结果。任何人都可以找出出现这种情况的原因吗?此外,是否有更有吸引力/稳定的方法来实现这一想法?如果是这样,有什么好处?

1 个答案:

答案 0 :(得分:0)

答案在你的堆栈跟踪中。 -setCurrentTrack:正在调用-setCurrentTrack:。您的-setCurrentTrack:代码是什么?