我是iOS编码新手,我在这里环顾四周并尝试了几种方法来解决这个问题,但似乎没什么用。我很害羞,因为我的一些愚蠢的错误: - )
我有一个分段表,总共约25行,分为2个部分。
每个cell.accessoryView
都有一个开关,我尝试在NSArray
时将开关状态存储在0
中,但在任何情况下记录该索引处的数组内容都会奇怪地返回(nonatomic, readwrite)
。
(该数组被实例化为TableViewController
的属性OFF
,并已合成)
显然,当我上下滚动表时,所有开关都返回默认的- (void)viewDidLoad
{
[super viewDidLoad];
//countries dict and switch state array init..
self.countries = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"countries" ofType:@"plist"]];
NSNumber *b = [NSNumber numberWithBool:NO];
for (int i=0; i<210; i++) {
[statiSwitch addObject:b];
NSLog(@"%d", [[statiSwitch objectAtIndex:i] integerValue]);
}
//tableview drawing..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellWithSwitch";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];
//Simple tag calculation...
NSInteger tagOb = indexPath.section * 100 + indexPath.row;
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];
mySwitch.tag = tagOb;
if ([statiSwitch count] > tagOb) {
[mySwitch setOn:[[statiSwitch objectAtIndex:tagOb] boolValue] animated:NO];
}
cell.textLabel.text = country;
cell.accessoryView = mySwitch;
return cell;
}
状态。
感谢您的帮助!
- (void) switchChange:(UISwitch *)sender {
NSNumber *c = [NSNumber numberWithBool:sender.on];
[statiSwitch replaceObjectAtIndex:sender.tag withObject:c];
NSLog(@"switch tag is: %i and state is: %d", sender.tag, sender.on);
NSLog(@"switch states array value: %d", [[statiSwitch objectAtIndex:sender.tag] integerValue]);
}
然后在交换机状态更改时调用的方法:
{{1}}
答案 0 :(得分:0)
在-viewDidLoad中:
for (int i = 0; i < [self.cellDataArray count]; ++i) {
CustomCell *cell;
cell = [self.tableView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:nil];
cell.delegate = self;
[self.cellsArray addObject:cell];
}
在您的cellForRowAtIndexPath中,执行以下操作:
cell = self.cellsArray [indexPath.row]; //或.item如果使用collectionView
由于交换机连接到每个单元,因此您需要CustomCell类中的一个方法,该方法将根据交换机执行某些操作,并且可能会向委托类发送调用。
答案 1 :(得分:0)
我使用了一个简单的int array
来存储开关值,它看起来比由具有switchTag和switchState属性的对象组成的NSMutableArray
更好,这是我以前做过的事情。 / p>
以下是代码:
- (void)viewDidLoad
{
//[here goes the code to retrieve my table data from a dictionary, getting sections and rows]
//int array iniazialization, with zeros to have switches set at OFF at beginning
for (int i = 0; i < 300; i++) {
switchStates[i] = 0;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cella";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//Cell drawing..
NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];
cell.textLabel.text = country;
//Calculate the tag to be assigned to the switches..
switchTag = indexPath.section * 100 + indexPath.row
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];
mySwitch.tag = switchTag;
mySwitch.on = switchStates[switchTag];
cell.accessoryView = mySwitch;
return cell;
}
//switch change action..
- (void) switchChange:(UISwitch *)sender {
switchStates[sender.tag] = sender.on;
}
现在我“只是”将这些开关值存储在核心数据中。有关我即将出现的问题,请参阅此处: - )
答案 2 :(得分:0)
我认为你在添加对象之前已经省略了初始化statiSwitch。
在for循环之前的viewDidLoad中,添加此行
statiSwitch = [NSMutableArray array];