【问题标题】:Providing params to manually loaded Xib files before viewDidLoad在 viewDidLoad 之前提供参数以手动加载 Xib 文件
【发布时间】:2014-10-17 03:08:03
【问题描述】:

是否有任何可能的方法来提供从 Xib 文件手动加载的视图,其中参数 before viewDidLoad 被调用(因为我需要这些参数已经在 viewDidLoad 中)?

我正在加载 Xib 文件:

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

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

我不太确定 options 参数的作用。可以用来给加载的 Xib 的视图控制器提供参数吗?

【问题讨论】:

    标签: ios iphone swift xib


    【解决方案1】:

    我的解决方案是保持您的 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".
    
    }
    

    【讨论】:

      【解决方案2】:

      可能有一种更高级、更优雅的方法来解决这个问题,但我设法用这种有点不雅的方法让它工作:

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

      【讨论】:

        【解决方案3】:

        我不知道将选项传递给手动加载的笔尖的方法。 我会走的路是以下之一:

        • 在您的视图控制器中,您将用于自定义初始化的属性很少。在将视图控制器放入层次结构之前,您必须设置它们。
        • 在视图控制器中有一个配置块,您将在 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 的性质取决于您的用例。

        【讨论】:

        • 感谢您的回答!你介意举个例子吗?我猜你的第一个建议不是指静态(类)属性?在任何情况下,调用 Xib 的视图控制器中的自定义方法(例如 setup())总是在 viewDidLoad 之后调用,即使我在加载调用之后立即调用它。
        • 感谢 Nicola 的示例。试过了,但它不起作用。 setupOptions 在 vi​​ewDidLoad 中仍然为零。如果它在 viewDidLoad 之前设置属性但方法调用同时不起作用,我会感到惊讶。
        • 您是否尝试在视图控制器上使用initWithNibName 而不是 loadNibNamed?
        • 其实initWithNibName本质上只能用在VC类中,不能用在使用Xib的VC类的VC类中,这样就需要对架构做一些较大的改动,比如不使用VC类例如,作为 Xib 中的基类。我不确定这是否值得。我更喜欢将 Xib 加载到使用 Xib 的 VC 的视图控制器中。
        • 我不明白这一点,但也许是因为我不了解您案件的大局。你在哪里调用 loadNibWithName?我的意思只是初始化要通过 initWithNibName 而不是另一个推送的视图控制器的实例。唯一的目的是更好地控制何时调用 VC 生命周期回调。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多