1

カスタムセルを使用してテーブルビューを実装しました。

1.カスタムセル ここに画像の説明を入力

日付を表示するラベルとアラームを設定する UI スイッチを持つカスタム セル。

uiswitches をオンにすると、テーブル ビューは次のように表示されます。 ここに画像の説明を入力

2.テーブルビュー

When user scrolls down the table view the bottom switches are turned off

ここに画像の説明を入力

上にスクロールしても同じ問題。

ここに画像の説明を入力

なぜこの問題が発生するのですか?そしてそれを防ぐ方法は?

インデックス パス メソッドの行のセル

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Note: I set the cell's Identifier property in Interface Builder to DemoTableViewCell.
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
    }

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    //To display custom cell with label and switch
    if(indexPath.row< [appDelegate.alarmsArray count])
    {
        ReminderCell *cell = (ReminderCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
        if (!cell)
        {
            NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
            cell = [topLevelItems objectAtIndex:0];
        }

        cell.reminderSwitch.tag = indexPath.row;

        NSMutableDictionary *dict = [appDelegate.alarmsArray objectAtIndex:indexPath.row];
        cell.label.text = [dict objectForKey:@"string"];
//=========================================
        cell.reminderSwitch.on = NO;
//=========================================
        return cell;
    }


    //Add + button on the last row of uitableview cell..
    if(indexPath.row == [appDelegate.alarmsArray count])
    {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
        button.frame = CGRectMake(114, 9.5, 33, 33); 
        [button addTarget:self action:@selector(AddNewRow:) forControlEvents:UIControlEventTouchUpInside]; 
        [cell.contentView addSubview:button ];
        return cell;
    }

    return cell;
}
4

3 に答える 3

1

ほとんどの場合、セルを再利用していないため、セルが表示されるたびにスイッチが作成されます (すべてのセルの内容も)。ただし、セル ビューを再利用しても、必要な値に応じてスイッチのオン/オフ プロパティを設定する必要があるため、注意してください。だからあなたの方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        /** THIS SHOULD BE REPLACED BY YOUR CONSTRUCTOR FROM NIB FILE **/
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }

    UISwitch *switch = (UISwitch *)[cell viewWithTag:SWITCH_TAG];
    switch.on = *is_on*;

    return cell;
}
于 2012-05-03T06:07:48.740 に答える
1
In CustomCell Class Write function like this 

-(void)SetSwitchStatus:(NSInteger )stat
{
    if(stat == 0)
      //Set Switch off
    else
    //Set Switch on
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    StoresCustomCell *cell =(StoresCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"StoresCustomCell" owner:self options:nil];
        cell = StoreCell;
    }
    [cell SetSwitchStatus:[StatusArr objectAtIndex:indexPath.row];
}

In ViewdidLoad Function Set 0 elements to all statusArr,,  StatusArr count = TableView rows Count

- (void)tableView:(UITableView *)sender didSelectRowAtIndexPath:(NSIndexPath *)path {

if([[StatusArr objectAtIndex:path.row] isEqualToString:@"0"])
   [StatusArr replaceObjectAtIndex:path.row withObject:@"1"]
else
   [StatusArr replaceObjectAtIndex:path.row withObject:@"0"]
}
于 2012-05-03T06:27:22.820 に答える
1

問題は cellForRowAtIndexPath: datasource メソッドにあります。テーブルがスクロールすると、セルが作成されて再利用されるため、各セルのロジックはセルの状態を推測できないことに注意してください。

あなたはおそらく(あなたがすべきです)、時間とともにアラームを含む配列と、それらが設定されているかどうかを示すブール値を保持します...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"AlarmCell";  // your cell identifier goes here

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    CustomAlarmCell *alarmCell = (CustomAlarmCell *)cell;
    Alarm *alarm = [self.alarmArray objectAtIndex:indexPath.row];

    BOOL alarmIsSet = [alarm.isSet intValue];        // you should have an NSNumber 0 or 1 to indicate the alarm is set
    NSString *alarmTimeString = [alarm timeString];  // assume it has a date formatter and can render alarm time as string

    alarmCell.timeLabel.text = alarmTimeString;  
    alarmCell.isSetSwitch.on = alarmIsSet;

    return (UITableViewCell *)alarmCell;
}
于 2012-05-03T06:10:34.070 に答える