37

我正在使用情节提要instantiateViewControllerWithIdentifier:,我注意到IBOutlets我连接的所有内容仍然为零。但是,IBActions我已经完成了工作。视图和控制器是链接的(即 controller.view 不是 nil),如果我显示视图,它会显示我所期望的。

我错过了什么?

这是我的设置:

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

6 回答 6

71

视图似乎只有在第一次访问后才被正确初始化。打电话时问题消失

[self presentViewController:vc animated:NO completion:nil];

或更简单地说

[vc view];
于 2012-12-06T01:53:50.570 回答
4

【拿我当坏榜样】

毕竟可能不是一个好主意,它可以工作,但它违反了常规加载,使应用程序不稳定^_^。
我会在此处留下答案,以防其他人想知道您是否这样做。


我遇到了同样的问题,但是我设计的自定义组件没有通过 presentViewController 加载(加载到上一个视图的覆盖中)

你可以简单地打电话

myViewController.loadView()//迅速

[myViewController loadView]//对象-C

于 2016-06-15T11:24:42.077 回答
0

插座是通过键值编码建立的,你可以把它放到你的视图控制器子类中:

- (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 的两个调用上设置断点。

在调试器中,我会尝试:

  1. 将“自我”与您认为您正在应用插座的视图控制器进行比较。也许您的故事板有第二个您没想到的视图控制器。当您说您“设置所有者”时,我认为这是一个奇怪的术语。除了已经存在的表示之外,您是否拖出了一个立方体对象来表示您的视图控制器?

  2. 将 [self valueForKey:key] 或 [self valueForKeyPath:keyPath] 或仅 [self outletName] 与调用 super 后传入的值进行比较。也许你的二传手没有做你想做的事。我已经多次看到这样的错误,人们有一个名称为“firstName”的对象的出口,然后是一个带有选择器“setFirstName:”的操作。这会混淆键值编码,最终会得到 setFirstName: 在 nib 加载期间被调用,目的是建立出口,但出口的设置器是作为操作方法实现的,所以出口永远不会被设置。

于 2012-09-21T04:54:27.320 回答
0

为实例化的 ViewController 设置框架似乎设置了 IBOutlets。

前任:

DemoViewController *demoVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"demoVC"];
demoVC.frame = self.view.frame; //or CGRectMake(0, 0, 1015, 604);

这将初始化 DemoViewController 的 IBOutlets,如 Label、TextField、Button、Table 等。

希望这可以帮助。

于 2013-01-28T10:41:05.523 回答
0

人们给出了如何加载视图的解决方案(其中一些你不应该使用 ( loadView()) 所以这里有一种方法来检查你的视图是否已经加载

我遇到了这个问题,因为我有一个带有didSet观察者的属性来更新 UI,如果尚未设置插座,这显然不起作用,所以这里有一些示例代码如何解决它:

var name: String? {
    didSet {
        updateNameLabel()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    updateNameLabel()
}

func updateRoomLabel() {
    guard isViewLoaded() else {
        return
    }
    [...]
}

因此,现在当您显示网点时会更新,而且每次更新属性时也会更新

于 2016-09-26T15:05:06.677 回答
0

如果您要链接到的对象是场景中的顶级实体,例如 ArrayController,则引用必须是强的(而不是弱的!),因为它不被视图层次结构保留。弱引用可能会导致您所描述的问题。

在这里查看更多信息:IBOutlets 在 ARC 下应该强还是弱?

于 2016-05-26T18:35:21.043 回答