Ios 情节提要实例化EviewController标识符未设置IBOutlets

Ios 情节提要实例化EviewController标识符未设置IBOutlets,ios,interface-builder,uistoryboard,Ios,Interface Builder,Uistoryboard,我正在使用storyboardInstanceEviewController的标识符:,我注意到我连接的所有iboutlet仍然为零。然而,iActions我已经完成了工作。视图和控制器是链接的(即controller.view不是nil),如果我显示视图,它将显示我期望的内容 我错过了什么 这是我的设置: 我的故事板中定义了一个视图控制器。我给了它一个标识符,该标识符与调用instantialeviewcontrollerwhiteIdentifier: 我已经通过单击视图控制器(就在Firs

我正在使用storyboard
InstanceEviewController的标识符:
,我注意到我连接的所有
iboutlet
仍然为零。然而,
iActions
我已经完成了工作。视图和控制器是链接的(即controller.view不是nil),如果我显示视图,它将显示我期望的内容

我错过了什么

这是我的设置:

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

  • 出口是通过键值编码建立的,您可以将其放入视图控制器子类中:

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

    在调试器中,我会尝试:

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

  • 在调用super之后,将[self-valueForKey:key]或[self-valueForKeyPath:keyPath]或[self-outletName]与传入的值进行比较。也许你们的二传手并没有按你们的意愿去做。我见过这样的一个错误出现过好几次,人们用“firstName”这样的名称为对象设置一个出口,然后用选择器“setFirstName:”执行一个操作。这会混淆键值编码,最终导致setFirstName:在nib加载期间被调用,目的是建立出口,但出口的setter是作为操作方法实现的,因此从未设置出口


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

    [self presentViewController:vc animated:NO completion:nil];
    
    或者更简单地说

    [vc view];
    

    为实例化的ViewController设置帧似乎是为了设置IBOutlets

    例:

    这将初始化DemoViewController的IBOutlet,如标签、文本字段、按钮、表格等


    希望这会有所帮助。

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


    查看此处了解更多信息:

    [将我作为坏榜样]

    也许这不是一个好主意,毕竟它是有效的,但它违反了常规加载,使应用程序不稳定。
    我会把答案留在这里,以防其他人想知道你是否这样做


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

    你只要打个电话就可以了

    myViewController.loadView()
    //Swift


    [myViewController loadView]
    /Obj-C

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

    我遇到了这个问题,因为我有一个带有
    didSet
    observer的属性来更新UI,如果尚未设置插座,该属性显然不起作用,因此下面是一些如何解决这个问题的示例代码:

    var name: String? {
        didSet {
            updateNameLabel()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        updateNameLabel()
    }
    
    func updateRoomLabel() {
        guard isViewLoaded() else {
            return
        }
        [...]
    }
    

    因此,现在当您显示Outlet时,您会得到更新,但每次更新属性时,我都会尝试将视图拆分为自己的nib,我发现同样的问题。initWithNibName:bundle:似乎也不会设置IBoutlet,即使它们是通过在IB中按ctrl键单击并拖动定义的。作为一种解决方法,我使用[[NSBundle mainBundle]loadNibNamed:@“myNib”所有者:控制器选项:nil]。这会加载nib并将IBOutlets分配给控制器中的值。但是,当控制器上有一个方法似乎在执行相同的操作时,这似乎是错误的。我对您的设置有点困惑,为什么要设置视图的所有者?您的IBOutlets被放置在故事板上的viewcontroller中,对吗?当y如果您将此VC的类型设置为与自定义标题和实现相匹配,则可以实例化此viewcontroller。更正:我没有将视图的所有者设置为与自定义类类型相匹配,而是将视图控制器类类型设置为与自定义类类型相匹配。如果您控制,请在情节提要中单击视图控制器的图标表示,以显示u连接HUD,你看到你所有的插座都连接了吗?这真的很奇怪。我的意思是,你知道这是否是正确的行为吗?这已经让我发疯了两天了,直到我找到了你的答案。我不确定这是否正确,但这是可以理解的。为什么仅仅因为创建了视图控制器就设置视图和所有东西。一个could假设当您拥有视图控制器时,您需要视图,但谁知道是什么优化导致了这种行为。但它应该在某个地方记录下来。它是有效的,谢谢!我同意,它应该包含在文档中。它访问
    视图
    有什么魔力,而不是设置
    框架
    。它适用于至少是在视图层次结构中(不是,比如说自定义的
    NSObject
    对象)。从文档中:
    您不应该直接调用此方法。
    。首先,我只是盲目复制了此代码并加载了我的视图,但随后我遇到了无法解释的其他问题。删除此代码后,一切正常。我强烈建议
    var name: String? {
        didSet {
            updateNameLabel()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        updateNameLabel()
    }
    
    func updateRoomLabel() {
        guard isViewLoaded() else {
            return
        }
        [...]
    }