动态追加变量属性名称
我有一个自定义的UITableViewCell与多个按钮。 我想记住这些按钮是处于选定状态还是未选中状态,并将其存储在自定义核心数据模型类的属性中。 有多个自定义UITableViewCells,每个都有不同数量的按钮。
这些按钮被巧妙地命名为一个字符串:1,2,3 ...
为了解释这个项目:设想一位老师想要跟踪学生阅读书籍列表的章节数量。 目标是跟踪每个学生阅读的章节总数。 每本书都是一个UITableViewCell。 每本书都有独特的章节数量。 教师(或学生)在阅读每章时选择一个按钮。 读取的章节将被保存为一个属性,以便下次显示UITableViewCell时可以显示它。
#import "Student.h"
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
chaptersInBook = 16;
self.dickensArray = [NSMutableArray array];
// Book title
UILabel *bookLabel = [[UILabel alloc]initWithFrame:CGRectMake(20, 10, 100, 30)];
bookLabel.text = @"David Copperfield";
for (NSInteger index = 0; index < chaptersInBook; index++) // for loop runs 16 times
{
// Need to make correct number of buttons based on the chapters in each book
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.tag = index;
//buttons in rows of seven
button.frame = CGRectMake(40*(index%7) + 20,40 * (index/7) + 40, 30, 30);
[button setTitle:[NSString stringWithFormat:@"%d", index+1] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",index+1]] forState:UIControlStateNormal];
[button setTitle:[NSString stringWithFormat:@"%d", index+1] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateSelected];
[button addTarget:self action:@selector(toggleOnOff:) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
[self.contentView addSubview:bookLabel];
}
}
return self;
}
-(IBAction)toggleOnOff:(id)sender
{
UIButton *button = (UIButton *)sender;
button.selected = !button.selected; // In storyboard the default image and selected image are set
}
-(IBAction)buttonPressed:(id)sender {
UIButton* button = (UIButton *)sender;
if (button.selected) {
int chapter = button.tag + 1;
NSString *nameOfButton = [NSString stringWithFormat:@"%d",chapter];
NSString *buttonIsSelected = @"YES";
//Now I want to set student.ch1 to yes but I want to set the '1' to 'chapter'
//Not sure how to do this: append the name of a property with a variable.
}
所以,我的问题是,如何最好地将按钮状态存储到所选章节的学生属性中? 我希望我可以将章节号添加到'student.ch [在此添加章节号]',但我认为这不可能。
//eg.
student.ch1 = [NSNumber numberWithBool:YES];//but replace '1' with the value in the int variable 'chapter'
先谢谢你。 我想我在咆哮错误的树。
库尔特
由于按钮的数量很少(在注释中表示为28),因此可以在按钮上使用两个幂作为标签,并使用整数位掩码将所有28个按钮的状态存储在一个整数字段中。
考虑这个带有四个按钮的例子(你可以将它扩展到32而不需要太多改变)。 标记您的按钮,如下所示:
button1.tag = 0x01; // Binary 0001
button2.tag = 0x02; // Binary 0010
button3.tag = 0x04; // Binary 0100
button4.tag = 0x08; // Binary 1000
当选择一个按钮时, bitwise-OR
当前状态对其标签进行bitwise-OR
:
NSUInteger currentState = 0;
...
currentState |= button.tag;
当一个按钮未被选中时, bitwise-AND
与其当前状态的标记反转:
currentState &= ~button.tag;
要切换状态,可以将标记与当前状态XOR
:
currentState ^= button.tag;
当你需要重新应用选定/未选择状态到你的按钮时,你可以像这样做一个循环:
for (int i = 0 ; i != 28 ; i++) {
NSUInteger tag = 1<<i;
if (storedState & tag) {
UIButton *btn = [myView viewWithTag:tag];
// ... make the button selected ...
}
}
如果我的问题得到了解答,很容易回答:看看Key-Value-Coding - 这应该对你有所帮助!
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html
链接地址: http://www.djcxy.com/p/72657.html