故事板instantiateViewControllerWithIdentifier不设置IBOutlets

我正在使用storyboard instantiateViewControllerWithIdentifier:我注意到所有IBOutlets我已经连线了仍然为零。 但是,我已经联系IBActions工作。 视图和控制器是链接的(即controller.view不是零),如果我显示视图,它显示了我所期待的。

我错过了什么?

这是我的设置:

  1. 我有一个在我的故事板中定义的视图控制器。 我给了它一个标识符,这是我调用instantiateViewControllerWithIdentifier:时使用的标识符instantiateViewControllerWithIdentifier:
  2. 我已经通过点击视图控制器(就在First Responder下)设置视图的所有者,并在Identity Inspector下将Custom Class设置为与我想要连接视图的类相同的名称。
  3. 然后我打开助理编辑器,并控制拖动UI元素来创buildIBOutletsIBActions

视图似乎只有在首先被访问后才能正确初始化。 打电话时问题就消失了

 [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器中,我会尝试:

  1. 比较'自我'的视图控制器,你认为你正在申请的网点。 也许你的故事板上有你不期待的第二个视图控制器。 当你说你“成立了一个所有者”时,我认为这是一个奇怪的术语。 除了已经存在的表示之外,您是否拖出了一个立方体对象来表示您的视图控制器?

  2. 通过超级调用后将传入的值与[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 } [...] } 

所以现在当你显示的网点得到更新,而且每当你更新的财产