2013-07-30 87 views
0

如何在弹出当前UIViewController后在我以前的UIViewController上创建一个UIView。从另一个UIViewController在前一个UIViewController上创建UIView

在我以前的UIViewController我有一个可以在其他UIViewControllers访问的功能:

-(void)setMovieCompare:(NSString *)_movieName { 
    NSLog(@"Movie Compare %@",_movieName); 
    UIView *vw2ndPlayer = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 166)]; 
    [self.view addSubView:vw2ndPlayer]; 
} 

然后在我目前的UIViewController我有:

VideoPlayerViewController *_VideoPlayerViewController = [[VideoPlayerViewController alloc] initWithNibName:nil bundle:nil]; 
[_VideoPlayerViewController setMovieCompare:mediaObject.name]; 
[self.navigationController popViewControllerAnimated:YES]; 

这引起了我:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendString:]: nil argument' 
*** First throw call stack: 
(0x31a3e2a3 0x398a297f 0x31a3e1c5 0x31a0d773 0x72461 0x74077 0x33865595 0x7600b 0x7aa6d 0x3390828d 0x3398af81 0x3234c277 0x31a135df 0x31a13291 0x31a11f01 0x31984ebd 0x31984d49 0x3553b2eb 0x3389a301 0x6e89d 0x39cd9b20) 
libc++abi.dylib: terminate called throwing an exception 
+0

你确定没有在这两个类中使用'appendString'? –

+0

我在我的上一个UIViewController的某些部分使用appendString,但它只在ViewDidLoad上调用。 –

+0

可能在那里,你传递的参数是无应用程序崩溃的无响应。 –

回答

0

该代码崩溃,因为它试图从nibNamed:ni读取vc湖即使你有这样的工作,它也无法工作。该代码不会更改推送当前vc的VideoPlayerVC,它只是分配一个新的(尝试)并更改该新的视图,该视图在该方法结束后立即释放。

查看导航容器中的呈现视图控制器的方式是访问self.navigationController.viewControllers。

NSArray *vcs = self.navigationController.viewControllers; 
VideoPlayerViewController *previousVC = vcs[MAX(0, vc.count-2)]; 
[previousVC setMovieCompare ...]; 

达到导航数组可能不是最好的东西,特别是其他视图控制器可以呈现当前的vc。另一种设计是委托模式,其中VideoPlayerVC在推送之前将其自身设置为推送vs的委托。

+0

如果我这样做,这是否意味着我可以访问我以前的UIViewController的方法,并添加subview在self.view? –

+0

是的。你可以调用setMoveCompare:它可以添加一个子视图到self.view。这有点不寻常,但我不明白为什么它不起作用。更规范的方法是在前面的VC上设置一些状态,并在viewWillAppear中添加子视图(如果该状态已设置)。 – danh

+0

另一个想法是无条件地添加子视图(甚至可以在IB中绘制它),但将其保留.hidden = YES或.alpha = 0.0,直到它应该可见。 – danh

相关问题