选择行时 UITableView 崩溃

Posted

技术标签:

【中文标题】选择行时 UITableView 崩溃【英文标题】:UITableView crashing when selecting row 【发布时间】:2013-11-25 16:26:02 【问题描述】:

当我单击表格视图中的单元格时,应用程序崩溃:

// QuestionViewController.h

@interface QuestionViewController : UIViewController <UITableViewDelegate , UITableViewDataSource> 


@property (nonatomic, strong) AppDelegate *app;
@property (nonatomic, retain) PFObject *feed;
@end

// QuestionViewController.m

@synthesize app, feed;

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section

    return [[feed objectForKey:@"options"] count];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return 1;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    NSString *cellTxt = [[[feed objectForKey:@"options"] objectAtIndex:indexPath.row] objectForKey:@"option_text"];

    [[cell textLabel] setText:cellTxt];

    return cell;



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSLog(@"clicked cell");


- (void)viewDidLoad 
    [super viewDidLoad];
    app = [[UIApplication sharedApplication]delegate];
    feed = [app.feed objectAtIndex:0];

我已经实现了 didSelectRowAtIndexPath,但它在崩溃之前没有被调用。

SO 上的其他线程表明我有未连接的插座,但我检查过情况并非如此。

我正在创建上述 UIViewController 的多个实例,如下所示:

for (int a = 0; a < totalQuestions; a++) 

    QuestionViewController *temp = (QuestionViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"aQuestion"];

    temp.view.frame = CGRectMake(self.view.frame.size.width*a+scrollWidthBeforeAppend, 0, 320, 443);

    [scroller addSubview:temp.view];


并将它们添加到滚动视图中。它们显示正确,UITableView 已填充,并且除了我尝试单击单元格之外,一切似乎都正常。有什么建议吗?

【问题讨论】:

您不应该将一个控制器的视图添加到另一个控制器的视图中,而不使该视图控制器成为您要添加到的控制器的子级(使用自定义容器视图控制器 api)。 @rdelmar 维护一组视图控制器(如下面的回答)是一个坏主意/坏设计吗? 总的来说,这不是一个坏主意,它可以解决您的直接问题,但正如我在评论中所说,添加另一个控制器的视图而不使其成为一个孩子并不是一个好主意。如果这样做,父控制器会保留一个指向子控制器的强指针(在其 childViewControllers 数组中),因此无需创建自己的控制器数组。 【参考方案1】:

当你按下一个单元格时,你的临时 UIViewControllers 会被释放。 您应该保留对它们的引用以防止这种情况发生,例如在数组中。

【讨论】:

曾经读过一个如此简单明了的解决方案,以至于您不敢相信自己没有想到它?...就是这个解决方案。

以上是关于选择行时 UITableView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableView 添加到现有项目:添加数组以填充行时崩溃

滚动表格视图后点击选择行时如何修复崩溃?

使用 CoreData 删除行时 UITableView 崩溃

尝试移动 UITableView 行时崩溃

而在 indexPath 的 didselectrow 上选择取消选择行时会崩溃

在多节 UITableView 中添加行时崩溃