0

我是 iOS 编码的新手,我在 SO 中环顾四周并尝试了几种方法来解决这个问题,但似乎没有任何效果。我确信这是因为我的一些愚蠢的错误:-)

我有一个分区表,总共大约 25 行,分为 2 个部分。每个都有一个开关cell.accessoryView,我尝试在开关状态更改时将其存储在 a 中,但是无论如何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]);
}
4

3 回答 3

0
  1. 设置自定义单元类。
  2. 在情节提要中创建一个原型单元,并在其中放置一个开关。
  3. 将原型单元设置为您的自定义类,并设置重用标识符。
  4. 将开关连接到自定义单元类中的 IBOutlet。(如果您希望您的单元能够通信,还可以设置@protocol 和委托)
  5. 现在对于棘手/骇人听闻的部分:

在 -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];
}
  1. 在您的 cellForRowAtIndexPath 中,执行以下操作:

    细胞 = self.cellsArray[indexPath.row]; // 如果使用 collectionView,则为 .item

  2. 由于开关连接到每个单元,因此您需要在 CustomCell 类中使用一个方法,该方法将基于开关执行某些操作,并且可能会向委托类发送调用。

于 2013-07-19T19:00:36.327 回答
0

我认为您在向其添加对象之前省略了初始化 statiSwitch 。

在 for 循环之前的 viewDidLoad 中,添加这一行

statiSwitch = [NSMutableArray array];
于 2013-07-20T15:16:13.453 回答
0

我使用了一个简单int array的方法来存储开关值,它似乎比NSMutableArray由具有 switchTag 和 switchState 属性的对象组成的效果更好,这是我以前做的。

这是代码:

- (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;
}

现在我“只是”将这些开关值存储在核心数据中.. 在这里见我即将提出的问题 :-)

于 2013-07-20T14:59:16.490 回答