2013-03-04 63 views
0

自从使用addSubview和removeFromSuperview之后,故事板的发布已经很长时间了。显然我忘记了如何使用它们。从其上级视图中删除视图获取访问错误错误XCODE

所以我UIViewControllerA我有一个按钮,这个代码:

- (IBAction)buttonClickHandler:(id)sender { 

    dyf_FacebookViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Facebook"]; 
    [self.view addSubview:controller.view]; 

} 

它加载由UIViewControllerB处理一个UIView。现在这个视图可以被许多不同的ViewController调用为子视图,这就是为什么我将它从超视图中移除的原因。

于是就UIViewControllerB我有这样的代码:

- (IBAction)close:(id)sender { 

    [self.view removeFromSuperview]; 
} 

不幸的是一个坏的访问错误返回。请帮忙!

感谢

  • 迈克尔

编辑:

添加的子视图(子视图的视图 - 控制)将在控制去除本身,因为它是在子视图按钮的控制。所以,我没有访问原始controller.view变量,因为这是在ViewControllerA

+0

没有人问的是你为什么实例化,如果你只添加它到当前控制器主视图视图控制器的问题?除非你有非常具体的理由这么做,这是一个很大的错误,并且在最近的WWDC会谈中已经被广泛报道。如果您正在处理视图控制器遏制,您需要阅读更多关于它的信息,因为您做错了。最后一个视图不能有两个超级视图,所以当你将B视图添加到A控制器时,B控制器不再拥有该视图,所以当你调用它来移除视图时,坏的事情会在你遇到时发生。 – Rog 2013-03-04 05:03:49

回答

1

你必须保持你的dyf_FacebookViewController对象的引用,这样你就可以做到以下几点:

- (IBAction)close:(id)sender { 
    [controller.view removeFromSuperview]; 
} 

你现在在做的是从主视图中删除主视图,这会产生严重的后果,给你一个不好的访问。

+0

没错,但正如我所说的,关闭按钮代码保存在不同的ViewController中。所以我将不得不访问controller.view变量,我可以通过它吗? – 2013-03-04 03:56:18

+0

你可以实现一个委托机制,所以UIViewControllerA会知道什么时候close需要发生。你可以通过NSNotificationCenter做同样的事情。另外,也许你应该使用UIViewController容器API来实现更安全的实现。 – 2013-03-04 04:00:35

+0

我可能会设置一个委托。我不知道为什么我没有想到过。谢谢! – 2013-03-04 04:05:40

0

如果你想删除您添加视图,然后保持视图控制器的副本...

// in this VC.m 
@interface 
@property (nonatomic, strong) dyf_FacebookViewController *dyfController; 
@end 

- (IBAction)buttonClickHandler:(id)sender { 

    self.dyfController = [self.storyboard instantiateViewControllerWithIdentifier:@"Facebook"]; 
    [self.view addSubview:self.dyfController.view]; 
} 

后来,关闭视图...

[self.dyfController.view removeFromSuperview]; 
+0

虽然我没有访问其他视图控制器中的controller.view的权限。所以我怎么能把它传递给正在处理视图的新视图控制器。 – 2013-03-04 03:56:55

+0

是的。只要坚持参考。我会编辑。 – danh 2013-03-04 04:54:30

0
if ([controller.view superView]) { 
    [controller.view removeFromSuperview]; 
} 
0

试试这个

- (IBAction)close:(id)sender { 
for (UIView *subView in self.view.subviews) { 
    [subView removeFromSuperview]; 
} 
}