如何 select 一次一项 ios sdk

How select one item at a time ios sdk

我在 UITableView 中显示了选项值列表。

现在我希望用户 select 一件商品一次。但目前用户可以select所有选项。

我想要什么:

假设我有 5 个单选框:1 2 3 4 5 一次用户只能 select 一个。如果他选择另一个,那么前一个必须被删除select。

现在发生了什么:

目前所有的盒子都selected。

我在我的 didSelectRowAtIndex 方法中使用此代码:

 UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
 UIButton *btnRadhio = (UIButton *)[cell viewWithTag:1];

 for(int i =0;i<[arrDistanceList count];i++)
   {
     [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_unchecked"] forState:UIControlStateNormal];
   }

    [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_checked"] forState:UIControlStateNormal];

CellforRowAtIndexPath:

cell.btnRadhio.tag = (indexpath.row+1)*100;

DisselectRowAtIndexPath:

for(int i =0;i<[arrDistanceList count];i++)
{
   UIButton *btnRadhio = (UIButton *)[self.view viewWithTag:(i+1)*100];
   if(i==indexpath.row)
   {
   [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_checked"] forState:UIControlStateNormal];
   }
   else
   {
   [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_unchecked"] forState:UIControlStateNormal];
   }
}

希望对您有所帮助。

您需要一个 int class 变量并将选定的 indexpath.row 存储到其中并重新加载 tableview 并在 cellForRowAtIndexPath 中检查此变量并检查您选择的行。

我假设 arrDistanceList 是一个对象数组,每个对象代表您 table 中的一行数据。

您的 UI 由您的模型驱动是一种很好的做法。因此,假设数组中的每个对象都有 'title'、'background image' 等信息,请考虑一个简单的布尔标志,例如'selected',cellForRow 参考。

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIButton *btnRadhio = (UIButton *)[cell viewWithTag:1];

id object = [arrDistanceList objectAtIndex:indexPath.row];

if (object /* .selected */) {
    [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_checked"] forState:UIControlStateNormal];
} else {
    [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_unchecked"] forState:UIControlStateNormal];
}

在 didSelect 中进行选择时,翻转所选对象的布尔值并通过使用 NSPredicate 搜索关闭所有其他选择。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected == YES"];
NSArray *filteredArray = [arrDistanceList filteredArrayUsingPredicate:predicate];

您现在需要做的就是更新屏幕上所有可见的单元格。您可以使用 tableView.visibleCells 数组来执行此操作。

在主线程用for循环更新可见单元格是可以的,因为任何时候可见单元格的数量都会比较少。但是,arrDistanceList 数组中可能包含很多对象,因此您最终可能会考虑有一天在后台线程上更新此数组。

您正在为同一索引路径更改 UIButton:

  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //From Your Code

每次都必须获取新的indexPath。试试这个

  for(int i =0;i<[arrDistanceList count];i++)
{
    NSIndexPath *indexPathI=[NSIndexPath indexPathForRow:i inSection:0]; //i supposed you have 0 section
    UITableViewCell *cellI=[tableView cellForRowAtIndexPath:indexPathI];
    UIButton *btnRadhio = (UIButton *)[cellI viewWithTag:1];
    if(i==indexPath.row)
    {
        [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_checked"] forState:UIControlStateNormal];
    }
    else
    {
        [btnRadhio setBackgroundImage:[UIImage imageNamed:@"radio_unchecked"] forState:UIControlStateNormal];
    }
}

You can check here also