在Objective C中丢失viewDidLoad上的属性

时间:2013-06-14 08:51:04

标签: objective-c cocoa-touch properties

我正在尝试构建一个简单的应用,用户可以从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,此时我NSLogvideoURL作为(null)返回。

我正在声明videoURL这样:

@property (strong, nonatomic) NSString * videoURL;

所以我有几个问题:

  • viewController被解雇时,viewDidLoad是否会失去其属性?
  • 是否有更好的方法将属性发送到viewController
  • 我这样做完全错了吗?
  • 我是否需要提供更多代码?

2 个答案:

答案 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开头。因此,WWFPViewControllerdvc在您的案例中会更合适。

答案 1 :(得分:1)

您错误地初始化和配置新的控制器实例,一旦- (void)prepareForSegue:方法结束并且从未实际使用过,它就会被释放。另一个控制器实例由segue自动启动,然后呈现。这就是你看到“null”的原因,它没有真正配置。

如果您正在使用segues,则必须配置UIStoryboardSegue实例提供的目标视图控制器,而不是创建新的。

这样的事情:

wwfpViewController * DVC = (wwfpViewController *)segue.destinationViewController;