UIView 和 UILabel 在 IB 上创建,它们的出口在 viewDidLoad 中返回“nil”

Posted

技术标签:

【中文标题】UIView 和 UILabel 在 IB 上创建,它们的出口在 viewDidLoad 中返回“nil”【英文标题】:UIView and UILabel created on IB their outlets returning "nil" in viewDidLoad 【发布时间】:2015-01-05 22:14:45 【问题描述】:

我已经设置了一个带有 UIView (contentViewForScroll) 的 UIScrollView 来保存所有内容,如 http://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/ 所示,IB 没有显示任何关于放错位置、预期宽度等的警告......

但是当我尝试以编程方式添加约束以在 viewDidLoad 上设置“contentViewForScroll”的宽度时,我收到了一个奇怪的错误描述,在谷歌之后我发现这意味着您的对象的属性返回“nil”。这正是发生的事情!然后我意识到当我修改它的属性时,我有一个 UILabel 没有改变它的值。其他 UILabels 和 UIButtons 按预期更改了它们的文本和标题属性。

我尝试重命名这两个控件(这就是它具有如此长名称的原因),更改 .h 文件或 .m 文件中的定义。没有任何效果。

¿有什么想法吗?

这是我在 .m 文件中的代码:

@interface MarketsViewController ()
    @property (strong, nonatomic) IBOutlet UILabel *labelMarketName;  // This is returning nil
    @property (strong, nonatomic) IBOutlet UIImageView *imageVenueCover;
    @property (strong, nonatomic) IBOutlet UILabel *labelMarketAddress;
    @property (strong, nonatomic) IBOutlet UILabel *labelMarketCity;
    @property (strong, nonatomic) IBOutlet UIView *contentViewForScroll; // This is returning nil
@end

@implementation MarketsViewController
    - (void)viewDidLoad 
        [super viewDidLoad];

        NSLog(@"UIView: %@", self.contentViewForScroll);   // this is returning "UIView: (null)"
        NSLog(@"UILabel: %@", self.labelMarketName);   // this is returning "UILabel: (null)"
    
@end

谢谢

【问题讨论】:

其他 3 家分店没有返回 nil 吗? 不,在 viewDidLoad 我更改了所有 UILabel 的值,除了“labelMarketName”之外,它们都发生了变化:( 【参考方案1】:

您是否将情节提要中的对象链接到插座?为此,您可以打开助手编辑器并 ctrl 从情节提要中的对象拖动到上面代码中的插座。或者您可以从对象拖动到文件所有者并从那里选择出口。

需要注意的一点是,通常你想让你的 IBOutlets 弱而不是像上面那样强。

【讨论】:

是的,我是通过ctrl+drag添加的,属性声明旁边的小圆圈是“灰色”的。 Storyboard 中视图控制器的类是 MarketsViewController? 啊...实际上 viewDidLoad 是在设置属性之前调用的。尝试将代码放入 awakeFromNib。我忘了这个:) ***.com/questions/6302629/… 在 xib 文件中,是的,是视图控制器的类,正如我所说,其他 UILabel 正在按预期响应。很奇怪。 我也加入了“willViewAppear”,但我会尝试你的建议。但是为什么其他标签工作正常呢?

以上是关于UIView 和 UILabel 在 IB 上创建,它们的出口在 viewDidLoad 中返回“nil”的主要内容,如果未能解决你的问题,请参考以下文章

不要在我的 UIView 上指定宽度和高度约束(就像 UILabel 可以做的那样)

UIScroll 及其嵌套元素

以编程方式创建视图与 IB 相比的效率

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?

iPhone 在 IB 中为自定义 UIView 创建 UIButton

在 UIView 中以编程方式创建的 UILabel 未更新