iPad:UITableView问题

时间:2010-11-10 14:14:55

标签: ipad uitableview crash

我对iOS编程比较陌生,但在其他语言(主要是C#和Java)中有越来越多的编程经验。

我试图为iPad设备创建一些具有指定类别的图片库。 用户界面非常简单,可以从“选择屏幕”(FirstViewController,见下文)和“图库”中进行。选择屏幕包含2个UITableViews,masterdetail,分别显示产品类别和子类别。当用户进行选择时,它会点击“查看图片”button,图片将显示在“图库”的滚动视图中。 “Gallery”是一个单独的XIB文件,以模态方式呈现。一切正常。

但是,当用户在“图库”和“选择屏幕”之间来回切换时,会发生奇怪的事情。而奇怪的是,它恰好发生在他们之间的第四次“切换”。 我不断收到消息:

- [FirstViewController tableView:didSelectRowAtIndexPath:]:发送到解除分配的实例0x4b1f9f0的消息“

然后程序崩溃了...... 我已经设置了NSAutoreleaseFreedObjectCheckEnabled,NSZombiesEnabled和NSDebugEnabled,但仍然没有更详细的描述。甚至“Guard malloc”也没有帮助。

我理解这是一些内存问题,但不明白为什么?完美地工作3次,但不是第4次。

这是引起麻烦的代码部分:


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //check which table (master or detail) row is clcked then perform click event
    if( tableView.tag == 0){
        //populate list of brands using predefined function
        [self populateBrandNames:(int)indexPath.row];

        //reload data
        [detail reloadData];

        //4 a good UI experience we'll remove any previous picture loaded into brandImage
        bUserSelected = false;
        [brandImage setBackgroundImage:nil forState:UIControlStateNormal];
    }else{    //the detail table sent event
        NSIndexPath *master_row, *details_row;

        //get selected rows
        master_row = [master indexPathForSelectedRow];
        details_row = [detail indexPathForSelectedRow];

        NSString *logoName = [[NSString alloc] initWithFormat:@"%02d%02d_logo", (int)master_row.row, (int)details_row.row];
        NSString *path = [[NSBundle mainBundle] pathForResource:logoName ofType:@"jpg"];

        //check if we have path to resource (if logo exsist)
        if( path != nil ){
            UIImage *logo = [[UIImage alloc] initWithContentsOfFile:path];

            //display selected logo
            bUserSelected = true;
            [brandImage setBackgroundImage:logo forState:UIControlStateNormal];
            NSLog(@"brandImame set");

            //set current galery tag
            [currentGaleryTag setString:@""];
            [currentGaleryTag appendFormat:@"%02d%02d", (int)master_row.row, (int)details_row.row];
            [logo release];
        }else{
            NSLog(@"logo not loaded, galery tag : %@, category name : %@", logoName, [detail cellForRowAtIndexPath:details_row].textLabel.text );
        }

        [logoName release];
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

过了一会儿,我发现了导致问题的原因......

关键是,在这个特定的应用程序中,“Gallery”被称为模态。 Apple建议在使用模态视图时,调用者(处理显示的主视图)也必须关注同一视图。 在此方案中使用的最佳方法是使用描述delegate的“自定义”协议以及viewWillBeDismissed方法。

在我的代码中看起来像这样:

@protocol ModalViewControllerDelegate 

- (void)didDismissModalView;

@end

@interface Galery : UIViewController {
    //outlets declaration
    ...

    //some other declarations here...

    //delegate reference
    id delegate;
}

//outlets and views properties
@property (nonatomic, assign) id delegate;

@end

造成麻烦的是这一行:

@property (nonatomic, assign) id delegate;

需要改变的“唯一”事情就是这个

@property (nonatomic, retain) id delegate;

保留代表参考资料的目的是解决问题......

干杯!