1

我有一个表格视图,其中每个单元格都有一个UISwitch,当我选择一个单元格时,我将能够切换UISwitch,当我在表格视图中选择下一个单元格时,我不应该能够切换它,或者即使我想切换它之前选择应该用 , 关闭切换UIAlertView,所以基本上UITableViewCell应该只允许切换一个。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *cellIdentifier=@"cellIdentifier";
        PPtableCell *cell=(PPtableCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell==nil)
        {
            cell=[[PPtableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.remedyImage.image=[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyImageDic"];
        cell.remedyTextLabel.text=[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyTxtDic"];
        cell.remedyLabel.text=[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyName"];
        cell.remedyID=[[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyID"]intValue];
        cell.frequency = [[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyFrequency"]intValue];
        cell.symptomIDNo =[[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"SymptomID"]intValue];

        // cell.textLabel.text = [[notify objectAtIndex:indexPath.row] objectForKey:@"notifyData"];


        //  Specific Background Image Depending upon the Row

        if (indexPath.row==0)
        {
            cell.backgroundCellImage.image=[UIImage imageNamed:@"top-cell.png"];
        }
        else if (indexPath.row==remedyArray.count-1)
        {
            cell.backgroundCellImage.image=[UIImage imageNamed:@"bottom-cell.png"];
        }
        else
        {
            cell.backgroundCellImage.image=[UIImage imageNamed:@"middle-cell.png"];
        }


        if ([indexPath isEqual:remedySelectedIndexPath])
        {
            cell.isZoomedIn = YES;
        }
        else
        {
            cell.isZoomedIn = NO;
        }

        return cell;

    }

}



-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if(tableView==remedyTableView)
    {

        PPtableCell *cell = nil;
        cell=( PPtableCell*)[tableView cellForRowAtIndexPath:indexPath];
        cell.selectionStyle=UITableViewCellSelectionStyleNone;
        CGSize maximumLabelSize=CGSizeMake(320.0,100.0);
        CGSize expectedLabelSize=[cell.remedyTextLabel.text sizeWithFont:cell.remedyTextLabel.font constrainedToSize:maximumLabelSize
                                                           lineBreakMode:cell.remedyTextLabel.lineBreakMode];

        if (expectedLabelSize.height > 17 || expectedLabelSize.width > 260.0)
        {
            if ([indexPath isEqual:remedySelectedIndexPath])
            {
                remedySelectedIndexPath = nil;
                [remedyTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

            }
            else
            {
                oldSelectedIndexPath=remedySelectedIndexPath;
                remedySelectedIndexPath=indexPath;

                if (oldSelectedIndexPath==nil)
                {
                    [remedyTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:remedySelectedIndexPath] withRowAnimation:UITableViewRowAnimationNone];

                }

                else
                {
                    [remedyTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:oldSelectedIndexPath,remedySelectedIndexPath,nil] withRowAnimation:UITableViewRowAnimationNone];

                }
            }

        }

    }

}

这是处理 UISwitches 的代码:

(IBAction)notification:(id)sender {
    if (sender == notifyMe) {
        if(notifyMe.isOn == YES) {
            toggle = YES; 
            NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
            [defaults setBool:notifyMe.on forKey:@"switchValueKey"]; 
            [defaults synchronize]; 
            NSLog(@"Notification is ON");
        } 
    } else { 
        toggle = NO; 
    } 
} 

if ([cellDelegate respondsToSelector:@selector(notificationReqd:)]) { 
    [cellDelegate notificationReqd:self];
} 
}
4

3 回答 3

4

3个步骤-

  1. 设置setUserInteractionEnabledNO所有UISwitchtableView:cellForRowAtIndexPath:

  2. 设置setUSerIntertactionEnabled为特定单元格YESUISwitchtableView:didSelectRowAtIndexPath

  3. 设置setUSerIntertactionEnabled为特定单元格NOUISwitchtableView:didDeselectRowAtIndexPath

这就是你需要做的。

编辑:

对于 2 和 3,您必须参考您正在选择或取消选择的单元格。

为此,您必须在 2 和 3 中执行以下操作

UITableViewCell *cell=[yourTableView cellForRowAtIndexPath:indexPath];  
cell.notifyMe setUserInteractionEnable=YES; // set NO for step 3
于 2012-12-10T09:02:46.440 回答
0

为了获得更好的用户体验,您应该使用notifyMe.enabled而不是notifyMe.userInteractionEnabled.

首先,禁用所有开关。你可以做到这一点cellForRowAtIndexPath:

…
cell.notifyMe.enabled = NO;
…

要禁用正在取消选择的单元格中的开关:

- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == tableViewThatDealsWithSwitches)
    {
        PPtableCell *cell = (PPTableCell *)[tableView cellForRowAtIndexPath:indexPath];
        cell.notifyMe.enabled = NO;
    }
    return indexPath;
}

并启用即将被选中的单元格中的开关:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == tableViewThatDealsWithSwitches)
    {
        cell.notifyMe.enabled = YES;
        return indexPath;
    }
}
于 2012-12-19T09:10:39.630 回答
0

我对开关进行了类似的模拟。我用 UiSwitch 分配的标签制作了一个自定义视图,默认情况下禁用了用户交互。这个视图被设置为方法 cellForRowAtIndexPath 中的单元格的附件视图。

启用活动单元的交互实现

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

根据 NSIndexpath 在 yourtableview 单元格中找到带有开关的 customview 并设置其 userinteractionenabled 属性 yo YES

于 2012-12-10T08:49:07.750 回答