如何 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];
}
}
我在 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];
}
}