【问题标题】:IBOutletCollection of UIButtons is empty after viewDidLoadUIButtons 的 IBOutletCollection 在 vi​​ewDidLoad 后为空
【发布时间】:2013-03-28 19:00:40
【问题描述】:

正如标题所说,我的 UIButtons 的 IBOutletCollection 在 vi​​ewDidLoad 之后是空的。 我以同样的方式创建了一个 UILabels 的 IBOutletCollection,这个工作得很好。 知道如何解决这个问题,或者我在哪里犯了错误?

代码如下:

@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *lbl_save;
@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *lbl_cancel;
@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *lbl_edit;

@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *btn_changeData;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *btn_save;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *btn_cancel;

按钮放置在 xib 中并正确链接到相应的插座。就像标签一样。

我第一次按下按钮时,我想访问代码中的按钮。

for (UIButton *btn in _btn_changeData) {
    btn.hidden = NO;
    btn.userInteractionEnabled = YES;
}
for (UIButton *btn in _btn_save) {
    btn.hidden = YES;
    btn.userInteractionEnabled = NO;
}
for (UIButton *btn in _btn_cancel) {
    btn.hidden = YES;
    btn.userInteractionEnabled = NO;
}
for (UILabel *lbl in _lbl_save) {
    lbl.hidden = YES;
}
for (UILabel *lbl in _lbl_cancel) {
    lbl.hidden = YES;
}
for (UILabel *lbl in _lbl_edit) {
    lbl.hidden = NO;
}

这也是我得到以下异常并意识到我的 Button OUTletcollection 是空的。

-[UIButton countByEnumeratingWithState:objects:count:]:无法识别的选择器发送到实例 0xa8a8850

我既不覆盖 outletcollection,也不更改按钮的属性。 只是标签在集合中,而按钮不在。我也不知道为什么。

提前感谢您的帮助。

马夫

【问题讨论】:

    标签: ios xcode ipad uibutton iboutletcollection


    【解决方案1】:

    我想到的第一个想法是属性没有正确合成。 _btn_changeData 真的是 btn_changeData 属性背后的 ivar 吗?

    第二个想法是我在调试别人的代码时看到的。当插座连接不正确时,例如,如果控制器引用自身,则可以创建两个控制器实例。显然,只有其中的一个将连接插座。确保只创建实例。

    对于调试,自己实现 setter 可能是个好主意。

    编辑: 重读后,问题实际上与您在问题中所说的不同。报错信息-[UIButton countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xa8a8850

    并不意味着_btn_changeData 是一个空数组。这意味着有一个UIButton 而不是一个数组。 说了这么多,你应该检查一下你是不是在某处覆盖了_btn_changeData中的数据。

    【讨论】:

    • 因为我使用的是 xcode 4.6 和最新的 sdk,所以我根本没有任何 Synthesize。编译器会自动为我执行此操作。你的想法听起来都不错,但让我感到困惑的是,标签 outletcollections 工作正常,而按钮却不行。正如您在下图中看到的异常,调试器可以访问 ivar _btn_changeData 并且它不是 nil。因此它被正确初始化但它只是没有填充按钮。
    • @Maverick1st 更新了答案。请注意,调试器的工作方式与普通代码略有不同。当它说里面有NSArray 时,NSArray 可能取自 ivar 声明,而不是实际数据。
    • 就是这样。我的 xibs 连接中有一个具有相同标识符的剩余 UIButton,这覆盖了 outletcollection。您的回答暗示了我正确的方向。谢谢很多人。你为我节省了数小时的思考时间:)
    猜你喜欢
    • 2014-06-17
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多