在手机上测试时,应用程序因UITableViewScrollPositionMiddle而崩溃但不是模拟器

时间:2011-10-19 02:02:31

标签: iphone ios uitableview

我有一个带有字典值数组的uitableview,它产生了一个相当大的列表。 用户可以选择..一旦用户选择一个单元格我从导航堆栈弹出视图并将所有值传递回主视图..然后我允许用户返回到该视图,如果他们已经创建了一个错误,想改变他们的意见。

当他们点击回到该视图时,我有一个方法,使用UITableViewScrollPositionMiddle自动滚动到旧的选定视图。

但是我觉得它在手机上使用会造成一些错误,因为模拟器工作正常。

这是我认为错误发生的地方

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //Center previously selected cell to center of the screen
    [self.tableView scrollToRowAtIndexPath:oldCheckedData  atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; //<--- this method
}

这是我在将其构建到手机时在日志中出现的错误。获取此错误的过程是用户单击加载子视图的父视图中的单元格,用户选择子视图中的单元格并将其带回父视图..然后当用户返回时在同一子视图中显示在日志中。

2011-10-19 15:00:05.790 icode[1564:707] -[__NSArrayM section]: unrecognized selector sent to instance 0x181cd0
2011-10-19 15:00:05.797 icode[1564:707] CoreAnimation: ignoring exception: -[__NSArrayM section]: unrecognized selector sent to instance 0x181cd0

(没有滚动效果) 然后用户选择一个不同的单元格,这个应用程序崩溃,这显示在日志中

2011-10-19 15:01:08.272 icode[1564:707] -[__NSArrayM row]: unrecognized selector sent to instance 0x181cd0
2011-10-19 15:01:08.275 icode[1564:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM row]: unrecognized selector sent to instance 0x181cd0'
*** First throw call stack:
(0x35e9e8b3 0x366e61e5 0x35ea1acb 0x35ea0939 0x35dfb680 0x334a76cf 0x3353c713 0x30e1d 0x3352cd69 0x335a60ab 0x35cc32ab 0x35e72a57 0x35e726bd 0x35e71293 0x35df44e5 0x35df43ad 0x30fa4fed 0x334a7dc7 0x24f7 0x24a0)
terminate called throwing an exception(gdb) 

任何帮助将不胜感激。

Tableview数据源

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [arraysByLetter count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString *currentLetter = [sectionLetters objectAtIndex:section];
    return [[arraysByLetter objectForKey:currentLetter] count];
}

/*
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    //override state-based properties set earlier by the table view, such as selection and background colorset up shit here
}
 */

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

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

    //Customize cell here
    cell.selectionStyle = UITableViewCellSelectionStyleNone; // no blue selection

    //Replaces previously selected cells accessory view (tick)
    if (indexPath == oldCheckedData) 
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } 
    else 
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } 

    //Display cells with data
    NSArray *keys = [self.arraysByLetter objectForKey:[self.sectionLetters objectAtIndex:indexPath.section]];
    NSString *key = [keys objectAtIndex:indexPath.row];

    cell.textLabel.text = key;
    return cell;
}

//Section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    return [sectionLetters objectAtIndex:section];
}

//Section header titles
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return sectionLetters;

}

1 个答案:

答案 0 :(得分:0)

当从堆栈中弹出视图控制器时,看起来您在oldCheckedData处引用的索引路径可能已被释放。确保在视图控制器消失之前保留它。