0

我有一个选项值列表显示在UITableView.

现在我希望用户选择一次。但目前用户可以选择所有选项。

我想要的是 :

假设我有 5 个单选框: 1 2 3 4 5 一次用户只能选择一个。如果他选择了另一个,则必须取消选择上一个。

现在发生了什么:

目前所有的框都被选中。

我在我的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];
4

4 回答 4

0

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];
   }
}

希望这会帮助你。

于 2015-08-10T06:55:54.293 回答
0

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

于 2015-08-10T07:07:59.860 回答
0

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

您的 UI 由您的模型驱动是一种很好的做法。因此,假设您的数组中的每个对象都有诸如“标题”、“背景图像”等信息,考虑一个简单的布尔标志,例如 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 数组中可能有很多对象,因此您最终可能会考虑有一天在后台线程上更新此数组。

于 2015-08-10T07:24:10.337 回答
0

您正在为相同的索引路径更改 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];
    }
}

你也可以在这里查看

于 2015-08-10T08:31:54.600 回答