在viewDidLoad之前为手动加载的Xib文件提供params

时间:2014-08-23 10:28:45

标签: ios iphone swift xib

有没有办法在调用viewDidLoad之前提供一个带参数的Xib文件手动加载的视图>因为我需要在viewDidLoad中找到这些参数?

我正在使用以下代码加载Xib文件:

NSBundle.mainBundle().loadNibNamed(name, owner: owner, options: options)

然后立即调用viewDidLoad方法。显然没有办法手动覆盖和调用任何初始化程序。

我不确定选项参数的作用。它可以用于为加载的Xib视图控制器提供参数吗?

3 个答案:

答案 0 :(得分:0)

我不知道将选项传递给手动加载的nib的方法。 我将采取的方式之一是:

  • 在视图控制器中具有很少的属性,您将使用这些属性来自定义初始化。在将视图控制器放入层次结构之前,必须先进行设置。
  • 在视图控制器中有一个配置块,您将在viewDidLoad的末尾调用以获取所需的配置选项

在这两种情况下,实例化视图控制器的实体必须在推送视图控制器之前设置属性或块。 这将起作用,因为viewDidLoad方法is called just the first time the view is accessed,所以你仍然有时间在loadNibName和实际加载视图控制器的视图之间。

使用代码更新

您必须将实例属性添加到

class YourViewController: UIViewController {
   var setupOptions: [String: String]
   ...
}

然后,来自来电者:

YourViewController *yourVC = NSBundle.mainBundle().loadNibNamed(name, owner: owner, options: nil)[0]
yourVC.setupOptions = ["key1" : "val1", "key2" : "val2"]
// Then push the controller to the hierarchy. Only after this the viewDidLoad is called.
// You will be then able to use the stored setupOptions for any custom initialization. 

这当然只是一个例子。 setupOptions 的性质取决于您的使用案例。

答案 1 :(得分:0)

这可能是一种更先进,更优雅的方法来解决这个问题,但我设法让它采用了这样一种不太优雅的方法:

  1. 在Xib的视图控制器中创建一个静态(类)var,用于保存对需要为其提供参数的VC的引用。
  2. 创建选项VO类(或字典)并在加载Xib之前创建/设置其中的参数并存储在类中的var中。
  3. 从静态类的var访问已加载的Xib的viewDidLoad中的VO。

答案 2 :(得分:0)

我的解决方案是让您的viewDidLoad方法保持清晰。.
然后,在设置属性后,调用将使用这些属性的自定义方法,如下所示:

MyCustomController.h

- (void)setupView;

@property (strong, nonatomic) NSString *test;

MyCustomController.m

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)setupView {
    // this will work perfectly because this method is being
    // called AFTER self.test is set
    NSLog(@"test: %@", self.test);
}

用法

- (void)goToNextController {

    MyCustomController *controller = [[NSBundle mainBundle] loadNibNamed:@"MyCustomController" owner:self options:nil];

    // viewDidLoad will be called at this point..
    // so setting properties here will be useless.

    controller.test = @"our custom message here";
    [controller setupView];

    // so after our property('s) are set.. we call the "setupView" method.
    // the output would be: "test: our custom message here".

}