gpt4 book ai didi

iPad : UITableView issue

转载 作者:行者123 更新时间:2023-12-03 07:13:56 28 4
gpt4 key购买 nike

我对 iOS 编程还比较陌生,但在其他语言(主要是 C# 和 Java)方面拥有丰富的编程经验。

我正在尝试为 iPad 设备的某些产品制作一个类似图片库的东西,其中包含指定的类别。用户界面非常简单,由“选择屏幕”(FirstViewController,见下文)和“图库”组成。选择屏幕包含 2 个 UITableView,masterdetail,分别显示产品类别和子类别。当用户进行选择时,点击“查看图片”按钮,图片就会以 ScrollView 显示在“图库”中。 “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];
}
}

提前致谢!

最佳答案

过了一会儿我找出了导致问题的原因......

重点是,在这个特定的应用程序中,“图库”是模态调用的。苹果建议,在使用模态视图时,调用者(处理显示的主视图)还必须注意关闭同一 View 。在这种情况下使用的最佳方法是使用描述委托(delegate)的“自定义”协议(protocol)以及类似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;

保留委托(delegate)引用正在解决问题......

干杯!

关于iPad : UITableView issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145384/

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