故事板instantiateViewControllerWithIdentifier不设置IBOutlets
我正在使用storyboard instantiateViewControllerWithIdentifier:
我注意到所有IBOutlets
我已经连线了仍然为零。 但是,我已经联系IBActions
工作。 视图和控制器是链接的(即controller.view不是零),如果我显示视图,它显示了我所期待的。
我错过了什么?
这是我的设置:
- 我有一个在我的故事板中定义的视图控制器。 我给了它一个标识符,这是我调用
instantiateViewControllerWithIdentifier:
时使用的标识符instantiateViewControllerWithIdentifier:
- 我已经通过点击视图控制器(就在First Responder下)设置视图的所有者,并在Identity Inspector下将Custom Class设置为与我想要连接视图的类相同的名称。
- 然后我打开助理编辑器,并控制拖动UI元素来创build
IBOutlets
和IBActions
。
视图似乎只有在首先被访问后才能正确初始化。 打电话时问题就消失了
[self presentViewController:vc animated:NO completion:nil];
或者更简单
[vc view];
[用我作为坏榜样]
毕竟,它可能不是一个好主意,但它违反了正常的加载使应用程序不稳定^ _ ^。
我会在这里留下答案,以防其他人想知道你是否这样做。
我有同样的问题,但是我devise的自定义组件不是通过presentViewController加载(加载到以前的视图覆盖)
你可以直接打电话
myViewController.loadView()
// Swift
[myViewController loadView]
// Obj-C
设置实例化ViewController的框架似乎设置IBOutlets。
例如:
DemoViewController *demoVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"demoVC"]; demoVC.frame = self.view.frame; //or CGRectMake(0, 0, 1015, 604);
这将初始化DemoViewController的IBOutlets像标签,TextField,button,表等。
希望这可以帮助。
使用Key Value Codingbuild立Outlet,你可以把它放到你的视图控制器子类中:
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath { [super setValue:value forKeyPath:keyPath]; } - (void)setValue:(id)value forKey:(NSString *)key { [super setValue:value forKeyPath:key]; }
并把两个断点放在super上。
在debugging器中,我会尝试:
-
比较'自我'的视图控制器,你认为你正在申请的网点。 也许你的故事板上有你不期待的第二个视图控制器。 当你说你“成立了一个所有者”时,我认为这是一个奇怪的术语。 除了已经存在的表示之外,您是否拖出了一个立方体对象来表示您的视图控制器?
-
通过超级调用后将传入的值与[self valueForKey:key]或[self valueForKeyPath:keyPath]或者[self outletName]进行比较。 也许你有一个没有按照你的意图去做的二传手。 我曾经看到过这样的一个错误出现了几次,其中有一个名字叫“firstName”的对象,然后是一个带有select器“setFirstName:”的动作。 这混淆了键值编码,并且最终得到了setFirstName:在nib加载期间被调用,意图build立出口,但是出口的setter被实现为一个动作方法,所以从不设置出口。
如果要链接的对象是场景中的顶级实体(如ArrayController),则引用必须是强壮的(而不是弱!),因为它不被视图层次结构保留。 弱引用可能导致像你所描述的问题。
在这里寻找更多的信息:在IB之下IBOutlets应该强还是弱?
人们给出了如何加载视图的解决scheme(其中一些你永远不应该使用( loadView()
),所以这里是检查你的视图是否已经加载
我遇到了这个问题,因为我有一个用didSet
观察器来更新UI的属性,如果网点还没有设置,显然不工作,所以下面是一些示例代码如何解决它:
var name: String? { didSet { updateNameLabel() } } override func viewDidLoad() { super.viewDidLoad() updateNameLabel() } func updateRoomLabel() { guard isViewLoaded() else { return } [...] }
所以现在当你显示的网点得到更新,而且每当你更新的财产