单击按钮时EXC_BAD_ACCESS EXC_I386_GPFLT

时间:2014-08-12 15:50:45

标签: objective-c uiviewcontroller exc-bad-access

我有UIViewController UITableView,当tableView为空时我想显示另一个视图,所以我使用此

    [self.tableView setHidden:YES];
    NoKidsViewController *noKids = [self.storyboard instantiateViewControllerWithIdentifier:@"NoKidsView"];

    [self.view addSubview:noKids.view];

一切都很好,我能看到这个视图。但当我点击其中一个按钮时,我收到EXC_BAD_ACCESS EXC_I386_GPFLT错误。

//NoKidsViewController

    - (IBAction)addNewKid:(id)sender {
        AddKid *addKidController = [self.storyboard instantiateViewControllerWithIdentifier:@"AddKid"];
           [self.navigationController pushViewController:addKidController animated:YES];

    }

    - (IBAction)saleSpot:(id)sender {
        SaleSpot *saleSpotController = [self.storyboard instantiateViewControllerWithIdentifier:@"AddKid"];
        [self.navigationController pushViewController:saleSpotController animated:YES];
    }

我在网上搜索了3个小时,试图找到没有成功的解决方案。什么可能导致错误?我该如何解决?

1 个答案:

答案 0 :(得分:13)

noKids控制器超出范围并被取消分配。这就是通常被称为僵尸对象的东西。

您需要将noKids控制器添加到包含控制器的childViewControllers

NoKidsViewController *noKids = [self.storyboard instantiateViewControllerWithIdentifier:@"NoKidsView"];
[self addChildViewController:noKids];
[self.view addSubview:noKids.view];
[noKids didMoveToParentViewController:self];

这将保留NoKidsViewController,并允许视图控制器方法向下传递给它。有关创建自定义容器视图控制器的更多信息:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html