NSComboBox数据源配置后触发重复控制台日志问题求助
解决两个NSComboBox共用数据源/代理时控制台消息重复的问题
这个问题我之前也碰到过,核心原因是你没在数据源和代理方法里区分到底是哪个NSComboBox在发起请求——因为两个控件都绑定到同一个对象,方法被调用时如果不做区分,输出的内容自然会完全一致。下面给你两种靠谱的解决思路:
方法一:通过IBOutlet直接区分控件
- 先在你的
MyViewController类里给两个ComboBox分别添加IBOutlet属性:
@interface MyViewController : MyGeneralViewController @property (weak) IBOutlet NSComboBox *firstComboBox; @property (weak) IBOutlet NSComboBox *secondComboBox; @end
- 回到Interface Builder,把两个ComboBox分别拖到对应的IBOutlet上完成绑定。
- 在数据源方法里直接比较传入的
comboBox对象,区分处理并输出不同的控制台消息:
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)comboBox { if (comboBox == self.firstComboBox) { NSLog(@"第一个下拉框请求数据数量"); return 4; // 这里替换成第一个下拉框的实际选项数 } else if (comboBox == self.secondComboBox) { NSLog(@"第二个下拉框请求数据数量"); return 6; // 这里替换成第二个下拉框的实际选项数 } return 0; } - (id)comboBox:(NSComboBox *)comboBox objectValueForItemAtIndex:(NSInteger)index { if (comboBox == self.firstComboBox) { NSLog(@"第一个下拉框获取第%ld项数据", index); return [NSString stringWithFormat:@"第一组选项%ld", index + 1]; } else if (comboBox == self.secondComboBox) { NSLog(@"第二个下拉框获取第%ld项数据", index); return [NSString stringWithFormat:@"第二组选项%ld", index + 1]; } return nil; }
方法二:通过Tag值区分控件
如果不想添加额外的IBOutlet,也可以用Tag值来区分:
- 在Interface Builder中,选中第一个ComboBox,在右侧属性面板的
Identity Inspector里设置Tag值为1;第二个ComboBox设置为2(或者其他不重复的整数)。 - 在数据源方法里通过
comboBox.tag判断:
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)comboBox { switch (comboBox.tag) { case 1: NSLog(@"Tag为1的下拉框请求数据数量"); return 4; case 2: NSLog(@"Tag为2的下拉框请求数据数量"); return 6; default: return 0; } } - (id)comboBox:(NSComboBox *)comboBox objectValueForItemAtIndex:(NSInteger)index { switch (comboBox.tag) { case 1: NSLog(@"Tag为1的下拉框获取第%ld项数据", index); return [NSString stringWithFormat:@"选项%ld", index + 1]; case 2: NSLog(@"Tag为2的下拉框获取第%ld项数据", index); return [NSString stringWithFormat:@"选项A%ld", index + 1]; default: return nil; } }
两种方法都能解决你的问题,个人更推荐第一种,因为直接绑定控件的方式更直观,也不容易出现Tag值冲突的问题。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

