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

问题出在 cellForRowAtIndexPath: 数据源方法中。请记住,单元格是在表格滚动时创建和重用的,因此每个单元格的逻辑不能对其状态做出任何假设。

您可能(您应该)保留一个包含警报的数组,其中包含时间和一个布尔值以指示它们是否已设置...

- (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 回答
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 回答