0

弹出当前 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
4

1 回答 1

0

该代码崩溃是因为它试图从 nibNamed:nil 读取 vc。即使你让那个工作,它也不会工作。该代码不会更改推送当前 vc 的 VideoPlayerVC,它只是分配一个新的(尝试)并更改该新的视图,该视图在该方法完成后立即发布。

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

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

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

于 2013-07-30T05:58:44.467 回答