我正在尝试构建一个简单的应用,用户可以从tableViewController
中选择一个视频,然后加载播放视频的视频。我的问题是将视频的网址从tableViewController
转移到viewController
。
我关注this tutorial,我现在正在尝试调整代码来播放视频而不仅仅是显示图片
我正在viewController
创建tableViewController
,如下所示:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
wwfpViewController * DVC = [[wwfpViewController alloc] init];
NSIndexPath * path = [self.tableView indexPathForSelectedRow];
NSString * theVideoName = [videoNames objectAtIndex:path.row];
NSString * theVideoURL = [videoList objectAtIndex:path.row];
DVC.videoNum = path.row;
DVC.videoName = theVideoName;
DVC.videoURL = theVideoURL;
[DVC play];
}
然后触发此viewController
的播放消息,当我从此消息中NSLog
时,videoURL
存在且正确。
然后viewDidLoad
点了viewController
,此时我NSLog
将videoURL
作为(null)
返回。
我正在声明videoURL
这样:
@property (strong, nonatomic) NSString * videoURL;
所以我有几个问题:
viewController
被解雇时,viewDidLoad
是否会失去其属性?viewController
?答案 0 :(得分:4)
问题在于,尽管您正在使用segues,但您手动分配/初始化控制器并设置其属性(当然这与将要呈现的实例完全不同)。
这是你应该做的事情:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Grab the destination controller
// (it will be instantiated from the Storyboard automatically)
wwfpViewController * DVC = (wwfpViewController *)segue.destinationViewController;
NSIndexPath * path = [self.tableView indexPathForSelectedRow];
NSString * theVideoName = [videoNames objectAtIndex:path.row];
NSString * theVideoURL = [videoList objectAtIndex:path.row];
// Set the properties
DVC.videoNum = path.row;
DVC.videoName = theVideoName;
DVC.videoURL = theVideoURL;
[DVC play]; // Why don't you call this on viewDidLoad of the destination controller?
}
PS:在Objective-C中,您通常会按照惯例命名ivars,以便以小写字母和带有大写字母的Classes开头。因此,WWFPViewController
和dvc
在您的案例中会更合适。
答案 1 :(得分:1)
您错误地初始化和配置新的控制器实例,一旦- (void)prepareForSegue:
方法结束并且从未实际使用过,它就会被释放。另一个控制器实例由segue自动启动,然后呈现。这就是你看到“null”的原因,它没有真正配置。
如果您正在使用segues,则必须配置UIStoryboardSegue
实例提供的目标视图控制器,而不是创建新的。
这样的事情:
wwfpViewController * DVC = (wwfpViewController *)segue.destinationViewController;