2

当我insertSubview:atIndex:在我的 iPhone 上使用该方法时,程序无法运行,在 main.m 文件中有 EXC_BAD_ACCESS。然而,当我使用presentModalViewController程序运行完美。

此外,switchToView 方法在第一次使用时工作,与不同的 to 和 from,但第二次没有。

出了什么问题?

这是我的代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{    
  ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];
  [self switchToView:sbd from:self];
}

我的方法看起来像:

-(void)switchToView:(UIViewController*)nextView from:(UIViewController*)currentView
{
  [currentView.view insertSubview:nextView.view atIndex:1];
}
4

3 回答 3

5

看这里的视图属性

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

它严格地说明了我在评论中所说的内容:

“每个视图控制器对象是其视图的唯一所有者。您不能将同一个视图对象与多个视图控制器对象相关联。此规则的唯一例外是容器视图控制器实现可以将此视图添加为自己的子视图视图层次结构。在添加子视图之前,容器必须首先调用它的 addChildViewController: 方法来创建两个视图控制器对象之间的父子关系。

直接来自苹果!

于 2012-06-22T12:58:42.363 回答
0
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

[self switchToView:sbd from:self.view];
}

-(void)switchToView:(UIViewController*)nextView from:(UIView*)currentView{
[currentView insertSubview:nextView.view atIndex:1];
}

修改为这段代码

于 2012-06-22T13:10:24.363 回答
0

这是个问题:

ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

如果您不使用 ARC,这是内存泄漏,因为一旦包含该行的方法结束,您就无法释放该对象。

如果您使用的是ARC,它将自动释放sbd,并且在其视图中引用控制器的任何内容都将尝试使用 dealloc'd 对象。

您应该ShowBookDetails *sbd在此类中创建强(或保留)属性,而不是局部变量。

于 2012-06-22T13:14:54.730 回答