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 可以做的那样)
AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?