2016-02-08 4 views
1

Я создаю экран настроек для своего приложения, используя таблицу VC. В viewDidLoad я хочу показать пользователю его текущие настройки, выбрав ячейки. Затем появится флажок слева от выбранных ячеек. Это метод didSelectrowAtIndexPath:Как выбрать ячейку в виде таблицы без прокрутки?

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    for row in 0..<tableView.numberOfRowsInSection(indexPath.section) { 
     let cellToBeDeselected = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: indexPath.section)) 
     cellToBeDeselected?.accessoryType = .None 
    } 
    cell!.accessoryType = .Checkmark 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
} 

Это хорошо работает. Когда я выбираю строку, появляется галочка. Когда я выбираю другую строку, предыдущая галочка исчезает и появляется новая.

Однако, я хочу, чтобы строки были программными в viewDidLoad, чтобы показать текущие настройки.

Я нашел метод под названием selectRowAtIndexPath. Я попытался использовать это, но для этого требуется UITableViewScrollPosition. В документах указано:

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

Кажется, что всякий раз, когда я хочу выбрать строку, в представлении таблицы должно быть указано, где находится выбранная строка. Но я просто хочу его выбрать, и только выберите его.

Как это сделать?

+1

Вы не должны выбрать ячейку для того, чтобы показать выбор, вы можете сделать 'ячейку .accessoryType = .Checkmark' в' cellForRowAtIndexPath: 'при необходимости. –

+0

@FahriAzimov Пока он может показывать галочку, внутреннее состояние таблицы не будет отмечать ячейку как выбранную. Это может повлиять на выделение или отменить выбор с точки зрения пользователя. –

+0

, вы пытаетесь показать только галочку в одной строке, основываясь на последнем значении настройки? –

ответ

1

Это зависит исключительно от логики.

Вы пытаетесь отменить выбор всех строк сначала, когда выбрана любая строка. Как только вы отметили свой текущий код, выяснилось, что вы не поддерживаете состояние выбранной строки, так что это также вызовет проблему с декомпрессией, если выбранная ячейка будет повторно использована для другой ячейки, она покажет checkMark, даже если она не выбрана.

Вместо этого вам просто нужно поддерживать индексную переменную, которая будет хранить индексную строку выбранной строки. У вас есть 3 раздела, и 3 выборки разрешены, в этом случае вам просто нужно поддерживать один массив, который содержит значения selectedIndexPaths.

Объявить одно свойство в вашем представленииКонтроллер, как показано ниже.

var arraySelectedIndexPaths : Array<NSIndexPath> = Array(); 

В viewDidLoad: добавить три значения по умолчанию в соответствии с последней выбранной настройки.

предположим, последний раз, когда пользователь выбрал

row1 в section0

ROW2 в section1

row0 в section2

тогда ваш массив будет как следовать ,

 //in viewDidLoad 
     arraySelectedIndexPaths.append(NSIndexPath(forRow: 1, inSection: 0)); 
     arraySelectedIndexPaths.append(NSIndexPath(forRow: 2, inSection: 1)); 
     arraySelectedIndexPaths.append(NSIndexPath(forRow: 0, inSection: 2)); 

поэтому в вашем tableView:cellForRowAtIndexPath: пишите ниже логику. эта логика покажет checkMark в ячейке, если она выбрана, когда она появится на экране.

if indexPath == self.arraySelectedIndexPaths[indexPath.section] { 
    cell!.accessoryType = .Checkmark 
}else{ 
    cell!.accessoryType = .None 
} 

И в tableView:didSelectedRowAtIndexPath: написать логику, как показано ниже. Это обновит indexPath в массиве в соответствии с выбором. Будет также deSelect предыдущей строки и выберите новую строку.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 

//deSelected previously selected Cell 
     let cellToBeDeselected = tableView.cellForRowAtIndexPath(self.arraySelectedIndexPaths[indexPath.section]) 
     cellToBeDeselected?.accessoryType = .None 

    cell!.accessoryType = .Checkmark 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    self.arraySelectedIndexPaths[indexPath.section] = indexPath;//update new selected indexPath in array 
} 

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

@Sweeper вы пытаетесь показать только галочку в одной строке, исходя из последнего значения настройки? - HitendraHckr

@HitendraHckr Да, я. Я пытаюсь показать галочку в трех разных строках, поскольку есть три настройки: Sweeper

Итак, у вас есть 3 раздела для разных 3 настроек? - Hitendra Hckr

и я думаю, что любой может быть выбран в одном разделе, я прав? - Hitendra Hckr

@HitendraHckr Да, вы правы - Sweeper

+1

На самом деле я использую статические ячейки ... поэтому нет 'cellForRowAtIndexPath' ... Но в любом случае, это хороший ответ! +1 – Sweeper

+0

спасибо, это будет работать в обоих случаях, как в статическом, так и в динамическом режиме. –

2

Как указано в the documentation, вы можете указать UITableViewScrollPositionNone для положения прокрутки, что не приведет к прокрутке.

+0

Нет. Я читал документы. Опция '.None' не такая. Он по-прежнему будет прокручиваться. Он прокручивает минимальное количество, чтобы сделать ячейку видимой, не так ли? – Sweeper

+2

Вы попробовали? Для этого конкретного метода он ведет себя по-разному.«Передача UITableViewScrollPositionNone приводит к отсутствию прокрутки, а не к минимальной прокрутке, описанной для этой константы». –

+0

@Sweeper Да, документация здесь неправильная. Это не прокрутка. – Deco

1

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

let indexpath = NSIndexPath(forRow: yourRow, inSection: yourColumn); 
self.tableView(tblObj, didSelectRowAtIndexPath: indexpath); 

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

+0

Это метод делегата, который уведомляет ваш контроллер просмотра, когда был сделан не программный выбор. Он указывает, что был сделан выбор *. Использование этого для «создания» выбора является хрупким, поскольку вы играете в систему и обходите путь выбора, предоставляемый системой. –

Смежные вопросы