在Objective C对viewDidLoad中失去性质(Losing properties on

2019-10-18 06:15发布

我试图建立一个简单的应用程序,用户可以选择从视频tableViewController ,然后加载播放视频的视图。 我的问题是从传输视频的URL tableViewControllerviewController

我跟着这个教程 ,现在我正在努力适应代码来播放视频,而不是只显示图片

我创建viewControllertableViewController是这样的:

- (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
  • 我这样做完全错了吗?
  • 我还需要提供更多的代码?

Answer 1:

问题是,尽管你使用塞格斯,您可以手动分配/初始化控制器并设置其属性(当然这是一个将要呈现一个完全不同的实例)。

这里是你应该做的事情,而不是:

- (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,你通常命名实例变量(按照约定),使他们开始用小信和班级,资本之一。 所以WWFPViewControllerdvc会在你的情况更合适的名称。



Answer 2:

你是错误的初始化和配置新的控制器实例,它被释放,一旦- (void)prepareForSegue:方法结束,并没有真正使用。 另一控制器实例由赛格瑞自动initilized然后呈现。 这就是你看到的“空”的原因,它不是真正的配置。

如果您使用的塞格斯,必须配置提供目的地视图控制器UIStoryboardSegue实例,而不是创造新的。

事情是这样的:

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


文章来源: Losing properties on viewDidLoad in Objective C