2016-09-30 4 views
0

Я пытаюсь использовать UITableview с множественным выбором и аксессуаром для галочки для выбранных рядов. Это в основном работает, если я включил и выключил вид аксессуара в tableView:didSelectRow.Должен ли я хранить собственный массив UITableView «isSelected» для мультиселектора?

Тем не менее, я попытался построить метод selectAll, и обнаружил, что массив выбранных ячеек очищается после того, как я развернул все ячейки и выбрал их, если я позвоню reloadData().

Я подозреваю, что перезагрузка таблицы очищает выбор. Я не знаю другого способа, чтобы все ячейки были нарисованы после того, как я установил выбранный флаг и аксессуар.

Мне интересно, нужно ли мне хранить собственный массив выбранных строк. Кто-нибудь еще построил что-то вроде этого? Это похоже на общий сценарий.

Любые советы или примеры кода оценены.

ответ

0

Возьмите массив и добавьте в него indexPath каждой выбранной ячейки и поместите условие в cellForRowAt..., чтобы в том случае, если в массиве содержится indexPath, установите его как выбрано.

+0

Наверное, я это понял. Также укажите язык (ObjC или Swift). –

0

вам нужно добавить некоторые функции в методе cellForRowAtIndexPath как это анг ваш вид кода контроллера, как этот

пусть мы возьмем один пример фотогалерее применения

class CreateEvent: UIViewController,UITableViewDataSource,UITableViewDelegate { 

var yourArray : [Photo] = [Photo]() 
//MARK: - Content TableView Methods 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) 
    let objPhoto = yourArray[indexPath.row] 
    if objPhoto.isPhotoSelected == true 
    { 
     cell.accessoryType = .Checkmark 
    } 

    return cell 

} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    let objPhoto = yourArray[indexPath.row] 
    objPhoto.isPhotoSelected = true 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    cell.accessoryType = .Checkmark 

} 
//MARK: Action Method 

func selectAllPhoto() 
{ 
    for objPhoto in yourArray 
    { 
     objPhoto.isPhotoSelected = true 
    } 

    tableView.reloadData() 
} 
} 

и еще одна вещь, которую вам нужно, чтобы создать свой пользовательский объект как

class Photo: NSObject { 

var photoName:String = "" 
var isPhotoSelected = false 

} 

надеюсь, что это поможет вам

0

Есть два подхода, которые вы можете предпринять. Один из них - отслеживать выбранные номера строк. Для этого вы можете использовать NSMutableIndexSet или его Swift-аналог IndexSet.

По существу, когда выбран ряд, добавьте его в набор. Когда вы отмените выбор, удалите его из набора. В cellForRowAtIndexPath вы можете использовать containsIndex, чтобы определить, следует ли показывать галочку.

Поскольку вы явно упоминаете проблему с выбором при перезагрузке таблицы, стоит рассмотреть проблему с сохранением номеров строк (будь то в наборе или массиве), и это номера строк могут меняться.

Скажем, я выбрал строки 4,7 и 9, и эти значения сохраняются в наборе индексов. Когда я перезагружаю данные, новые данные могут быть вставлены после «старой» строки 8, поэтому теперь я должен выбрать строки 4,7 и 10, но я буду выбирать еще 4,7 и 9.

Решение этого вопроса заключается в сохранении своего уникального идентификатора для данных, которые должны быть выбраны. Это будет зависеть от ваших данных, но скажите, что у вас есть строка, уникальная для каждого элемента.Вы можете сохранить эту строку в NSMutableSet или Swift Set, что опять-таки позволяет легко проверить, если данный элемент выбран с помощью contains

0

Лучший подход для множественного выбора является

Возьмите объект модели, в которые принимают все ваши атрибуты и один дополнительный атрибут boolean (например, isSelected), чтобы провести выбор.

В случае выбора строки

  1. извлекает соответствующий объект из массива
  2. Затем обновить isSelected логическое значение (например, isSelected = !isSelected) и загрузить таблицу.

В случае выбора всех случаях

  1. Просто цикл через массив.
  2. Извлечь объект модели из массива.
  3. сделать isSelected = true.
  4. После завершения цикла перезагрузите стол.

Надеюсь, что эта концепция поможет вам построить свою логику.

Счастливое кодирование ...