来自Storyboard的子类ViewController

Mat*_*mon 12 objective-c storyboard uiviewcontroller uiview ios

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

instantiateViewControllerWithIdentifier:
Run Code Online (Sandbox Code Playgroud)

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

如何获取我的子类的实例instantiateViewControllerWithIdentifier

Chi*_*buZ 15

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
}
Run Code Online (Sandbox Code Playgroud)


小智 6

您将必须使用对象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;
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 可悲的是,如果子类包含任何额外的实例变量,这将崩溃。这是因为object_setClass只是更改了isa指针。它不会分配任何额外的空间。尝试访问其他变量时,请立即开始运行。 (6认同)

Dan*_* T. -1

就投吧。

MyController *controller = (MyController *)[self.storyboard instantiateViewControllerWithIdentifier:@"myController"];
Run Code Online (Sandbox Code Playgroud)

或斯威夫特:

let controller = storyboard?.instantiateViewControllerWithIdentifier("myController") as! MyController
Run Code Online (Sandbox Code Playgroud)