如何在Storyboard中使用ViewController的自定义init

时间:2016-11-16 14:59:35

标签: ios objective-c constructor uistoryboard init

我有一个故事板,其中放置了所有的viewControllers。我使用StoryboardID作为:

AddNewPatientViewController * viewController =[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"addNewPatientVC"];
 [self presentViewController:viewController animated:YES completion:nil];

AddNewPatientViewController中,我添加了一个自定义初始化方法或构造函数,您可以这样说:

-(id) initWithoutAppointment
{
    self = [super init];
    if (self) {
        self.roomBedNumberField.hidden = true;
    }
    return self;
}

所以我的问题是使用上面提到的视图控制器,我可以init使用这个自定义init制作它。

我已尝试将此作为上述代码的替换,但它没有用。

AddNewPatientViewController *viewController = [[AddNewPatientViewController alloc] initWithoutAppointment];
 [self presentViewController:viewController animated:YES completion:nil]; 

2 个答案:

答案 0 :(得分:5)

使用这种方法并不是最好的主意。首先,我建议你在实例化后设置这个属性;它会更好

如果你想要制作这样的构造函数,你可以将你的代码放到实例化中,所以它看起来像

-(id) initWithoutAppointment
{
    self = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"addNewPatientVC"];
    if (self) {
        self.roomBedNumberField.hidden = true;
    }
    return self;
}

但它不是一个好的代码

EDITED

可能是风格问题,但我宁愿不这样做,因为视图控制器不必了解UIStoryboard;如果你想拥有这样的方法,最好把它移到一个单独的工厂。 如果我选择在没有Storyboard或故事板的其他项目中使用此VC,但使用其他名称,则会容易出错。

答案 1 :(得分:5)

您无法将故事板调用为自定义初始值设定项。

您想要覆盖init(coder:)。这是从故事板(或从笔尖创建视图控制器)时调用的初始化程序。

您的代码可能如下所示:

目标C:

- (instancetype)initWithCoder:(NSCoder *)aDecoder; {
    [super initWithCoder: aDecoder];
    //your init code goes here.
}

夫特:

required init?(coder: NSCoder)  {
  //Your custom initialization code goes here.
  print("In \(#function)")
  aStringProperty = "A value"
  super.init(coder: coder)
}

请注意,在Swift中,初始化程序必须在调用super.init之前为所有非可选属性赋值,并且必须调用super.init()(或者在这种情况下,{{ 1}}。