gpt4 book ai didi

iphone - 如何在运行时更改 UIStoryboard 中的 UIViewController 类名

转载 作者:可可西里 更新时间:2023-11-01 06:20:52 26 4
gpt4 key购买 nike

我在我的 Storyboard中设置了这个 UIViewController,其中包含我需要的所有导出、 View 和约束。完美的。我们称这个 WatchStateController 为抽象父类。

然后我有了这个 WatchStateController 的子类,称为 WatchStateTimeController,它将具有应用程序特定状态所需的功能。

因为我试图在 UIStoryboard 中使用 1 View Controller ,所以我在将 WatchStateTimeController 实例化为 WatchStateTimeController 类型时遇到了一些问题 - 它实例化为 WatchStateController。

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

WatchStateTimeController *timeController = (WatchStateTimeController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"WatchStateController"];

这是因为 Storyboard的 Identity Inspector 中的“Class”字段设置为“WatchStateController”。所以问题是,我如何在运行时仅更改身份检查器中设置的这个类名?

Identity Inspector

注意:忽略我尝试这样做的原因并专注于如何。如果您真的必须知道原因,可以阅读策略设计模式。

最佳答案

我正在使用一个稍微肮脏的解决方法来强制 Storyboard 与策略模式兼容:我在基本(抽象) View Controller 中编写了一个自定义分配器,它在 Storyboard 之前返回所需的具体 View Controller 子类的实例机制结束。

为此,您必须告诉基类您要实例化哪个子类。

因此,在基本 Controller 中:

Class _concreteSubclass = nil;
+ (void) setConcreteSubclassToInstantiate:(Class)c {
_concreteSubclass = c;
}

+ (id)allocWithZone: (NSZone *)zone {
Class c = _concreteSubclass ?: [self class];
void *object = calloc(class_getInstanceSize(c), 1);
*(Class *)object = c;
return (id)CFBridgingRelease(object);
}

这也为子类的 ivars 实例化了足够的内存。

Storyboard已知的“MyViewController” View Controller 类型只是“BaseViewController”;但是随后,在您要求 Storyboard实例化 View Controller 的地方,您可以执行如下操作:

[BaseViewController setConcreteSubclassToInstantiate:[SomeSubclassOfBaseViewController class]];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
SomeSubclassOfBaseViewController *vc = (SomeSubclassOfBaseViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:vc animated:NO completion:^{}];

具体的 View Controller 被实例化并顺利显示。

关于iphone - 如何在运行时更改 UIStoryboard 中的 UIViewController 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com