我正在尝试将一些数据传递给我的视图控制器类,如下所示:
MyViewController *vc = [[MyViewController alloc] init];
vc.myProperty = dataToBePassed;
[self.navigationController pushViewController:vc animated:YES];
我需要在viewDidLoad中进行一些视图配置,但看起来viewDidload比属性赋值更早调用。
然后在MyViewController实现中:
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%@", self.myProperty); // Here i get myProperty = nil
}
- (void)viewWillAppear
{
[super viewWillAppear];
NSLog(@"%@", self.myProperty); // Here i get myProperty = dataToBePassed but it's to late
}
如何在不实现单例或委托模式的情况下在viewDidLoad方法中传递数据?
答案 0 :(得分:1)
尝试这样做
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"MainStoryboard" bundle:[NSBundle mainBundle]];
MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"storyboardIdentifier"];
vc.myProperty = dataToBePassed;
[self.navigationController pushViewController:vc animated:YES];
您必须首先在视图控制器的故事板中设置故事板标识符。
答案 1 :(得分:0)
从技术上讲,有两种方法对于与应用程序相关的视图控制器的生命周期处理非常常见。
使用XIB 使用XIB时,创建和设置视图控制器的最常见(如果不是最常见)过程之一是以编程方式完成的。在此过程之后,当您初始化视图控制器时,您可以选择覆盖init方法,以便视图控制器在加载视图之前获取信息并简化调整绘制内容的过程。您还可以在视图控制器中创建一个方法,在该方法中传递要由视图控制器使用的数据。
使用Storyboard
如果您使用的是故事板,我建议您相信通过它设置segues。我发现它们使生活更轻松,它允许您使用某些方法来处理转换。其中一个是prepareForSegue:sender:
在该方法中,我发现在初始化访问目标控制器后,更容易设置视图控制器。您也可以考虑在viewDidLoad
之前获得所有数据,因此遵循segue方法。
答案 2 :(得分:0)
虽然您提供的代码示例在技术上看是正确的,但我与@ john-elemans的关系是您需要显示更多代码。
有一些东西引用了导致它加载的视图,因此会导致viewDidLoad
过早地触发。
在任何情况下,如果某些内容(例如您的财产)对于正确构建视图结构是绝对必要的,我会在其自己的指定初始化程序中添加,例如,
- (id)initWithPhotoDiameter:(CGFloat)diameter
{
self = [super init...]; // some VC initializer that you should call
if (self) {
_photoDiameter = diameter;
}
return self;
}
请注意使用支持实例变量_photoDiameter
而不是self.photoDiameter。这是关于你应该使用支持ivar的类中唯一的地方,因为self
仍处于初始化过程中。