选择行时 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 崩溃