我知道这个问题过去已经被问过,但我真的很困惑,无法摆脱它。
我有9个指向IB对象的指针,如:
IBOutlet UIButton * but1;
IBOutlet UIButton * but2;
...
NSMutableArray *按钮;
声明的属性:
在IB中,我已经建立了从按钮到指针的连接。@property(nonatomic,retain)IBOutlet UIButton * but1;
@property .....
我现在需要用这些指针填充数组按钮来运行像
这样的UIButton方法[[buttons objectWithId:0] setImage:[UIImage imageNamed:@“image1.png”]];
我知道我无法用指针填充数组,有没有办法让IBOutlets进入数组?
答案 0 :(得分:1)
你不能用任意指针填充Cocoa容器,但指向类类型对象的指针 - 比如你的UIButton
- 都没问题。
Cocoa容器保留并释放添加到它们的对象,因此指向非类类型的指针必须包含在例如NSValue
。
另请注意,IBOutlet
不是类型,它是一个空宏,仅用于标记Interface Builder的代码部分。
答案 1 :(得分:0)
你过度思考问题。默认情况下,对所有对象的所有引用都是指针。
此:
IBOutlet UIButton *but1;
...定义一个指针。
因此,对象的所有默认操作都使用指针。你通常甚至不必考虑它。要将指向UIButton的指针添加到NSMutableArray,只需使用(注意self
表示法):
[self.buttons addObject:self.but1];
IBOutlet指定对代码中的引用没有影响。它就在那里,所以Interface Builder可以解析源代码并找出应该注意哪些属性。否则,它什么都不做,你可以忽略它。
当然,我不得不问:为什么要将已命名属性的按钮放入数组?
而不是:
[[buttons objectWithId:0] setImage:[UIImage imageNamed:@"image1.png"]];
......为什么不这样做?
[self.but1 setImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal];
如果不使用名称作为主要参考,则使用命名属性没有多大意义。