【问题标题】:How to use custom init of ViewController in Storyboard如何在 Storyboard 中使用 ViewController 的自定义初始化
【发布时间】:2017-03-30 20:09:46
【问题描述】:

我有一个故事板,其中放置了我的所有视图控制器。我使用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;
}

所以我的问题是通过使用上述呈现视图控制器的 wat,我如何使用我制作的这个自定义 init init 它。

我已尝试将其作为上述代码的替换,但没有奏效。

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

【问题讨论】:

  • 嗨,Talha,如果您使用的是故事板,那么使用故事板 segues 尤其是在“prepareForSegue”方法中自定义您的呈现控制器可能会是更清洁的解决方案?

标签: ios objective-c constructor uistoryboard init


【解决方案1】:

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

如果你还是想创建这样的构造函数,你可以将你的代码实例化到它上面,所以它看起来像

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

但它不会是一个好的代码

已编辑

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

【讨论】:

  • 使它成为返回类型为instancetype 的类方法,这将是很好的代码。
  • 我同意 Cy。这应该是一个类工厂方法(返回类的新实例的类方法)。请参阅我对覆盖指定初始化程序的回答,initWithCoder:
  • 最好使用类方法(工厂方法,例如 createWithoutAppointment)而不是 initWithout...我不确定,但您的示例中似乎违反了 init ARC 语义(不调用 super init,并且您正在将 self 分配给一个自动释放的对象)。
【解决方案2】:

您不能让故事板调用自定义初始化程序。

您想覆盖init(coder:)。这是从情节提要(或从 nib,就此而言)创建视图控制器时调用的初始化程序。

您的代码可能如下所示:

目标-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()(或在本例中为 super.init(coder:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多