2015-08-10 2 views
0

У меня есть список значений параметров, отображаемых в UITableView.Как выбрать один элемент одновременно ios sdk

Теперь я хочу, чтобы пользователь один раз выбирал один элемент. Но в настоящее время пользователь может выбрать все опции.

Что я хочу:

Пусть у меня есть 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]; 
+0

ли вы назначая различные метки для кнопки в каждой кнопке Cell и доступа с присвоенным тегом в LOOP не выходит из цикла, установите его фоновое изображение в петле –

+0

Я создал Butoon в раскадровке, используя пользовательскую ячейку. и все кнопки имеют тег 1, поскольку они находятся в ячейке просмотра таблицы @MuhammadWaqasBhati – user5185785

+0

Что такое цикл for for и где вы храните выбор? – Wain

ответ

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

You can check here also

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

Надеюсь, это поможет вам.

+0

не работает ... сбой при возникновении следующей ошибки: «Завершить приложение из-за uncaught exception 'NSInvalidArgumentException', reason: '- [UIView setBackgroundImage: forState:]: нераспознанный селектор, отправленный в экземпляр 0x7fdbca5b1a50' – user5185785

+0

Я сделал редактирование для своего кода, любезно проверяю его Теперь он будет работать –

0

Необходимо иметь одну переменную класса int и сохранить выбранный файл indexpath.row в нее и перезагрузить tableview, а в cellForRowAtIndexPath проверить эту переменную и проверить выбранную строку.

0

Предполагаю, что arrDistanceList представляет собой массив объектов, каждый из которых представляет строку данных в вашей таблице.

Хорошей практикой является то, что ваш пользовательский интерфейс управляется вашей моделью. Итак, скажем, каждый объект в вашем массиве имеет такую ​​информацию, как «заголовок», «фоновое изображение» и т. Д., Рассмотрим простой логический флаг, например. '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 может иметь много объектов в нем, поэтому вы можете в конечном итоге рассмотреть возможность обновления этого массива в фоновом потоке в один прекрасный день.