每个分区表行的附件中的UISwitch

时间:2013-07-19 14:04:48

标签: ios uitableview xcode4.6 uiswitch accessoryview

我是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}}

3 个答案:

答案 0 :(得分:0)

  1. 设置自定义单元格类。
  2. 在故事板中创建一个原型单元格,并在其中放置一个开关。
  3. 将原型单元格设置为自定义类,并设置重用标识符。
  4. 将交换机连接到自定义单元类中的IBOutlet。 (如果您希望您的小区能够进行通信,还可以设置@protocol和委托)
  5. 现在是棘手/黑客的一部分:
  6. 在-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中,执行以下操作:

      cell = self.cellsArray [indexPath.row]; //或.item如果使用collectionView

    2. 由于交换机连接到每个单元,因此您需要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];