gpt4 book ai didi

ios - UITableView 崩溃 : dequeueReusableCellWithIdentifier:

转载 作者:行者123 更新时间:2023-11-29 01:39:56 25 4
gpt4 key购买 nike

我正在创建一个 UITableView,它基本上包含一定数量的项目 + 1 个默认项目,它们将始终像这样存在。当只有默认项存在时,没有任何问题。一旦创建了 tableView 并包含超过默认项,应用程序就会崩溃并出现此索引越界错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

代码:

-(id)initWithFrame:(CGRect)frame scene:(Group *)scene{
self = [super initWithFrame:frame];
cardList = [[NSMutableArray alloc]init];
for(Card *card in [[AppDataManager getInstance]getCards]){
if(card.type.intValue == 2){
if(![card.properties containsObject:scene.id]){
[cardList addObject:card];
}
}
}
self.scene = scene;
[self setDataSource:self];
[self setBackgroundColor:[UIColor clearColor]];
[self setSeparatorColor:[UIColor clearColor]];
[self setBounces:NO];
[self setScrollEnabled:NO];
[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, (44 * (cardList.count + 1)))];
[self registerClass:[AddSceneToCardListCell class] forCellReuseIdentifier:@"addSceneToCardCell"];
return self;
}

-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return cardList.count + 1;
}

-(AddSceneToCardListCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
AddSceneToCardListCell *cell = [self dequeueReusableCellWithIdentifier:@"addSceneToCardCell" forIndexPath:indexPath];
if(indexPath.row == cardList.count){
//Default row
[cell.imageView setImage:[UIImage imageNamed:@"ic_action_add.png"]];
[cell.textLabel setText:@"New card"];
}else{
Card *card = [cardList objectAtIndex:indexPath.row];
[cell.imageView setImage:[UIImage imageNamed:@"ic_scene_icon.png"]];
[cell.textLabel setText:card.title];
}
[cell setBackgroundColor:[UIColor clearColor]];
return cell;
}

利用我出色的 NSLog 技能,我发现当应用程序到达 dequeReusableCellWithIdentifier 行时会发生崩溃。它似乎可以毫无问题地创建第一个非默认单元格,但默认单元格会崩溃。

堆栈:

* thread #1: tid = 0x20185e, 0x333c5df0 libsystem_kernel.dylib`__pthread_kill + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x333c5df0 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x33444cc6 libsystem_pthread.dylib`pthread_kill + 62
frame #2: 0x33361908 libsystem_c.dylib`abort + 76
frame #3: 0x3266a9c8 libc++abi.dylib`abort_message + 88
frame #4: 0x32684670 libc++abi.dylib`default_terminate_handler() + 268
frame #5: 0x32d49f24 libobjc.A.dylib`_objc_terminate() + 192
frame #6: 0x32681de2 libc++abi.dylib`std::__terminate(void (*)()) + 78
frame #7: 0x326818ae libc++abi.dylib`__cxa_rethrow + 102
frame #8: 0x32d49dd2 libobjc.A.dylib`objc_exception_rethrow + 42
frame #9: 0x245b629c CoreFoundation`CFRunLoopRunSpecific + 632
frame #10: 0x245b6012 CoreFoundation`CFRunLoopRunInMode + 106
frame #11: 0x2c087200 GraphicsServices`GSEventRunModal + 136
frame #12: 0x27d82a08 UIKit`UIApplicationMain + 1440
* frame #13: 0x0014260c Application`main(argc=1, argv=0x003f5afc) + 108 at main.m:14

编辑我有点想通了。崩溃似乎是因为我设置的委托(delegate)类导致的,所以与上面的代码无关。无论如何,每个人都感谢您的帮助。

最佳答案

异常表明您遇到了索引范围问题。这与 dequeReusableCellWithIdentifier 没有任何共同之处!

请提供调用堆栈?您可以通过两种方式获取它:

  • 如果发生崩溃并且程序将在主函数中停止,请在调试器控制台中键入:bt。
  • 或者添加异常断点,当它被命中时,从 Xcode 的左 View 复制异常线程的调用堆栈(这种方法更好,因为您可以检查变量的值)。

我怀疑您正在以错误的方式处理从表中添加或删除项目,这就是为什么 indexPath.row 给您的值超出了预期范围。引发异常时检查此值(使用第二种方法进行调用堆栈检查)。

向我们展示与“新卡”功能相关的代码。

关于ios - UITableView 崩溃 : dequeueReusableCellWithIdentifier:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com