我在迭代自定义对象的NSMutableArray时遇到问题。每当我运行以下代码时,它将迭代数组6次,尽管NSMutableArray对象中只有2个对象。
//Configure the Settings Screen
[self addSection:^(JMStaticContentTableViewSection *section, NSUInteger sectionIndex) {
section.title = @"Twitter Accounts";
//alloc and init the twitterSwitchesArray to store the switches used in the view
self.twitterSwitchesArray = [[NSMutableArray alloc] initWithCapacity:[self.twitterAccounts count]];
NSLog(@"LOADING: twitterAccounts Array count: %i", [self.twitterAccounts count]);
for(MessageBlastSavedTwitterAccount *twitterAccount in _twitterAccounts)
{
NSLog(@"Configuring: %@", twitterAccount.twitterAccountDescription);
//Configure the Twitter Setting Switch
[section addCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) {
UISwitch *twitterSwitch = [[UISwitch alloc] init];
twitterSwitch.accessibilityLabel = twitterAccount.twitterAccountDescription;
twitterSwitch.on = [self switchShouldBeFlippedForTwitterAccount:twitterAccount.twitterAccountDescription];
NSLog(@"LOADING: Twitter account %@, should be enabled: %i", twitterAccount.userEnteredDescription, [self switchShouldBeFlippedForTwitterAccount:twitterAccount.twitterAccountDescription]);
[self.twitterSwitchesArray addObject:twitterSwitch];
[twitterSwitch addTarget:self action:@selector(flippedTwitterSwitch:) forControlEvents:UIControlEventValueChanged];
staticContentCell.reuseIdentifier = @"UIControlCell";
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [twitterAccount userEnteredDescription];
cell.imageView.image = [UIImage imageNamed:@"210-twitterbird.png"];
cell.accessoryView = twitterSwitch;
}];
}
}];
我得到以下输出:
2012-10-04 20:47:27.703 MessageDraft[1206:c07] LOADING: twitterAccounts Array count: 2
2012-10-04 20:47:27.703 MessageDraft[1206:c07] Configuring: coryb
2012-10-04 20:47:27.704 MessageDraft[1206:c07] LOADING: Twitter account @coryb, should be enabled: 1
2012-10-04 20:47:27.705 MessageDraft[1206:c07] Configuring: cocoaapp
2012-10-04 20:47:27.706 MessageDraft[1206:c07] LOADING: Twitter account @cocoaapp, should be enabled: 1
2012-10-04 20:47:27.708 MessageDraft[1206:c07] LOADING: Twitter account @coryb, should be enabled: 1
2012-10-04 20:47:27.709 MessageDraft[1206:c07] LOADING: Twitter account @cocoaapp, should be enabled: 1
2012-10-04 20:47:27.713 MessageDraft[1206:c07] LOADING: Twitter account @coryb, should be enabled: 1
2012-10-04 20:47:27.714 MessageDraft[1206:c07] LOADING: Twitter account @cocoaapp, should be enabled: 1
我甚至尝试过手动方式(下面)迭代数组,我仍然有完全相同的问题:
// The self.twitterAccounts count returns a 2, so this should only repeat twice.
for(int i = 0; i < [self.twitterAccounts count]; i++)
{
NSLog(@"%i", i);
//Configure the Twitter Setting Switch
[section addCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) {
UISwitch *twitterSwitch = [[UISwitch alloc] init];
twitterSwitch.tag = i;
twitterSwitch.on = [self switchShouldBeFlippedForTwitterAccount:_twitterAccount.description];
self.twitterAccount = [_twitterAccounts objectAtIndex:i];
NSLog(@"LOADING: Twitter account %@, should be enabled: %i", _twitterAccount.userEnteredDescription, [self switchShouldBeFlippedForTwitterAccount:_twitterAccount.description]);
[self.twitterSwitchesArray addObject:twitterSwitch];
[twitterSwitch addTarget:self action:@selector(flippedTwitterSwitch:) forControlEvents:UIControlEventValueChanged];
staticContentCell.reuseIdentifier = @"UIControlCell";
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.tag = i;
cell.textLabel.text = [_twitterAccount userEnteredDescription];
cell.imageView.image = [UIImage imageNamed:@"210-twitterbird.png"];
cell.accessoryView = twitterSwitch;
}];
}
}];
对此问题的任何帮助将不胜感激!
答案 0 :(得分:1)
我是JMStaticContentTableViewController的创造者。
addCell:
方法未被多次调用。您将传递到 JMStaticContentTableViewCellBlock
方法的addCell:
块将作为控制器的tableView:cellForRowAtIndexPath:
方法的一部分进行调用。
这样做是为了让您可以正确配置UITableViewCells
并有效地重复使用。
在查看上面的代码之后,我建议您迭代两次,一次正确配置twitterSwitchesArray
,另一次使用tableView:cellForRowAtIndexPath:
方法中要调用的代码。
您可以查看执行for循环以及在JMStaticContentTableViewCellBlock
right here内运行循环安全代码的示例。
JMStaticContentTableViewController
的设计使您仍然可以像传统的基于委托的UITableViewController
模型一样“思考”它,而是使用块。
这就是为JMStaticContentTableViewCellBlock
UITableViewCell
实例传递的原因,这样您就可以像对待dequeueReusableCellWithIdentifier:
UITableView
方法一样对待它。它还传入JMStaticContentTableViewCell
模型对象实例,以便您可以配置一些在标准UITableViewCell
对象上无法理解或无法实现的内容,例如tableViewCellSubclass
或{ {1}}。
希望这有帮助!
答案 1 :(得分:0)
我认为问题不是for
循环,甚至不是此方法,而是addCell:
内部。您在addCell:
中设置的区块被多次调用。
答案 2 :(得分:0)
这是内部问题,最好使用((ClassName *)[mutableArray objectAtIndex:i])