【问题标题】:Removing a view from a SuperView on iOS 4 SDK从 iOS 4 SDK 上的 SuperView 中删除视图
【发布时间】:2011-10-08 09:13:05
【问题描述】:

我正在使用 iOS 4 SDK 开发 iPhone 3.1.3 应用程序。

我有两个 ViewController,mainViewController 和 AboutViewController。

我使用这段代码从 mainViewController 转到 AboutViewController(mainViewController.m 中的代码):

- (IBAction) aboutClicked:(id)sender
{
    AboutViewController* aboutController =
        [[AboutViewController alloc] 
         initWithNibName:@"AboutViewController"
                  bundle:nil];
    [self.view addSubview:aboutController.view];

    [aboutController release];    
}

这是从 AboutViewController 回到 mainViewController(AboutViewController.m 中的代码):

- (IBAction) backClicked:(id) sender
{
    [self.view removeFromSuperview];
}

当我点击 AboutViewController 上的后退按钮时,我得到一个 EXC_BAD_ACCESS。

我正在使用基于窗口的应用程序模板。

我也尝试在[self.view removeFromSuperview] 中添加断点,但我不能。

你知道为什么吗?

【问题讨论】:

    标签: iphone navigation views


    【解决方案1】:

    改为这样做:

    - (IBAction) aboutClicked:(id)sender
    {
        AboutViewController* aboutController =
            [[AboutViewController alloc] 
             initWithNibName:@"AboutViewController"
                      bundle:nil];
        [self presentModalViewController:aboutController animated:YES];
    
        [aboutController release];    
    }
    

    这是从 AboutViewController 回到 mainViewController(AboutViewController.m 中的代码):

    - (IBAction) backClicked:(id) sender
    {
        [[self parentViewController] dismissModalViewControllerAnimated:YES]
    }
    

    【讨论】:

    • 谢谢。您的答案有效,但是...您知道为什么我的代码会失败吗?
    • 它应该可以正常工作,您应该尝试使用 Zombies 来找出确切的问题。我猜你在 AboutViewController 的 dealloc 方法中过度释放了一些东西。如果僵尸想向您展示发生了什么,请尝试使用它们更擅长精确定位的工具。当我分配自动释放的 UI 组件(如 UIButton)然后尝试在视图控制器的 dalloc 方法中释放它时,通常会出现此错误。我为您提供了此解决方案,因为它更适合您的情况。
    【解决方案2】:

    您得到 EXC_BAD_ACCESS 的原因是因为在将 viewController 的视图添加为子视图后,您释放了控制器,因此触摸事件无法看到预期的 viewController 来处理它。

    像下面这样注释发布声明,它应该可以工作

    - (IBAction) aboutClicked:(id)sender
    {
        AboutViewController* aboutController =
        [[AboutViewController alloc] 
         initWithNibName:@"AboutViewController"
                  bundle:nil];
        [self.view addSubview:aboutController.view];
    
    //[aboutController release]; To avoid leaking consider creating aboutController variable at instance level and releasing it in the dealloc.
    }
    

    【讨论】:

    • @Cyprian 你是对的,但我只是想指出是哪个内存释放导致了错误,希望问题所有者将采用替代机制来管理此内存。现在,我更新了我的答案以提醒这一点。
    • 这是正确的答案。如果我释放 ViewController,我会得到一个 SIGABRT 异常。你说的对!!非常感谢! @Cyprian,您必须考虑删除您的 -1 点。谢谢。
    【解决方案3】:

    试试:

    [self presentModalViewController:aboutController animated:YES];
    

    呈现视图并:

    [self dismissModalViewControllerAnimated:YES];
    

    要删除视图...

    【讨论】:

    • 有时我在动画中遇到问题:presentModalViewController 中的YES 尝试动画:NO
    【解决方案4】:

    1) 将 aboutController 设为类级变量

    2) 创建一个委托方法来处理

    (IBAction) backClicked:(id) sender

    3) 在委托调用的实现中

     [aboutController.view removeFromSuperView];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多