来自Storyboard的子类ViewController

时间:2015-09-14 01:07:14

标签: ios objective-c uiview uiviewcontroller storyboard

我在Storyboard中创建了ViewController,我正在使用

instantiateViewControllerWithIdentifier:

加载它。但我需要将此VC作为基类,并使用3-4个子类来更改其属性。

如何使用instantiateViewControllerWithIdentifier获取子类的实例?

3 个答案:

答案 0 :(得分:11)

Swift 3 中的@Bhagyesh版本:

class func instantiateFromSuperclassStoryboard() -> SubclassViewController {
    let stroryboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = stroryboard.instantiateViewController(withIdentifier: "BaseViewController")
    object_setClass(controller, SubclassViewController.self)

    return controller as! SubclassViewController
}

答案 1 :(得分:4)

您必须使用对象c运行时。覆盖子类的init方法。使用'instantiateViewControllerWithIdentifier'创建一个BaseViewController对象。然后使用objc_setClass方法为创建的对象设置类。 以下代码将进入SubclassViewController.m。

    - (instancetype)init {
      UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"main" bundle:[NSBundle mainBundle]];
      UIViewController *baseClassViewController = [storyboard instantiateViewControllerWithIdentifier:@"baseClassIdentifier"];

      object_setClass(baseClassViewController, [SubclassViewController class]);
      return (SubclassViewController *)baseClassViewController;
    }

在此之后,您可以使用简单的[[SubclassViewController alloc] init]创建SubclassViewController对象。

答案 2 :(得分:-1)

投下它。

MyController *controller = (MyController *)[self.storyboard instantiateViewControllerWithIdentifier:@"myController"];

或斯威夫特:

let controller = storyboard?.instantiateViewControllerWithIdentifier("myController") as! MyController