2016-01-21 2 views
0

У меня есть UITableView с пользовательскими ячейками. Обычно, когда пользователь вводит клетку, он вызывает эту функцию:Нажмите на сотовый аксессуар

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    //Segue to another view 
} 

Если в этой точке зрения, они отмечают ячейку завершенным, когда они возвращают код добавит стандартный контрольный аксессуар.

Когда ячейка не закончена, мне нужна пустая проверка, которую можно использовать (я знаю, что я могу добавить пользовательский образный аксессуар) с помощью крана, позволяющего пользователю пропустить сегмент и быстро пометить ячейку как завершено. Но я не могу сделать и работу:

  1. врезки на основном корпусе клетки должны назвать didSelectRowAtIndexPath
  2. врезки на представлении аксессуаров (пустая галочка) должен вызвать другой набор кода.

Я пробовал принадлежностьButtonTappedForRowWithIndexPath, но он, похоже, даже не вызван.

func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) { 
    //Shortcut code to change the cell to "finished" 
} 

Можно ли иметь нажав на главном тело триггера одного набора кода и нажатия на спусковой крючок вид аксессуара другой? Если да, то как?

ответ

1

Вы должны добавить UIButton к своему пользовательскому UITableViewCell. Вы можете добавить цель для этой кнопки называется pressedFinished, говоря что-то вроде cell.button.addTarget(self, action: "finishedPress:", forControlEvents: .TouchUpInside) или что-то тогда в pressedFinished вы можете сказать что-то вроде:

func pressedFinished(sender:UIButton) 
{ 
    let location = self.tableView.convertPoint(sender.bounds.origin, fromView: sender) 
    let indexPath = self.tableView.indexPathForRowAtPoint(location) 
    //update your model to reflect task at indexPath is finished and reloadData 
} 

Это вообще не большая практика, чтобы использовать тег, поскольку они не имеют никаких внутренних имея в виду. Также теги, сопоставленные с indexPath.row, будут работать только в том случае, если таблица имеет один раздел.

Другой вариант может использовать UITableViewRowAction:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath:  NSIndexPath) -> [AnyObject]? { 
    let rowAction : UITableViewRowAction 
    if model[indexPath].finished 
    { 
     rowAction = UITableViewRowAction(style: .Normal, title: "Mark as Unfinished", handler: {(rowAction:UITableViewRowAction,indexPath:NSIndexPath)->() in 
     //mark as unfinished in model and reload cell 
     }) 
}else{ 
     rowAction = UITableViewRowAction(style: .Normal, title: "Mark as Finished", handler: {(rowAction:UITableViewRowAction,indexPath:NSIndexPath)->() in 
     //mark as finished in model and reload cell 
     }) 
    } 
    return [rowAction] 
} 
+0

Но вот что-то о том, чтобы вручную добавить кнопку, чтобы действовать как аксессуар ... программное добавление аксессуара велико! Он правильно регулирует его без растягивания и вертикальных центров. Добавление аксессуара даже регулирует тело ячейки. Самое важное для меня, в каком-то случае стол должен загружаться без каких-либо аксессуаров, так что приятно, что это будет простое включение-выключение. Невозможно добавить внешний вид аксессуаров и сделать его доступным? –

+0

Вы можете установить эту кнопку как аксессуар для элемента, но вам нужно установить цель таким же образом, как описано выше. AccessoryView - это свойство чтения UIView для чтения в UITableViewCell. Вы должны знать, что если вы установите аксессуар для установки, то атрибут accessoriesType игнорируется, поэтому, если вы хотите использовать UITableViewCellAccessoryCheckmark в действии кнопки, вам придется перезагрузить ячейку и установить accessView на nil и aspectType на UITableViewCellAccessoryCheckmark, и не было бы никакого способа для пользователя, чтобы отменить это действие, поскольку UITableViewCellAccessoryCheckmark не отвечает на краны – beyowulf

0

Его решение Objective-C. Когда вы добавили свой собственный accessoryButton, который не будет вызывать метод tableviewDelegate «accessoriesButtonTappedForRowWithIndexPath». Что вы должны сделать, создайте UIButton и addTarget этому методу, затем добавьте его как accessoryButton на tableViewCell. Также установите значение tag на кнопку как index path.row, чтобы узнать, какая строка нажата.

0

Я выбрал ответ, что я думал, что дал подробный ответ, и который помог мне. Тем не менее, я отклонилась от ответа немного, и хотела бы поделиться этим, а также:

Созданием аксессуара Просмотр Появляется/Исчезает

загружают несколько списков в одну раскадровке таблицы. Иногда в списке должны отображаться индикаторы, в других случаях не требуется никаких аксессуаров. Чтобы сделать это, я добавил кнопку в раскадровку, центрированную по вертикали, и трейлинг = 0 в правом представлении контейнера. Затем я дал ему ширину 0 и дал этому ограничению IBOutlet в моем коде. Когда мне нужен аксессуар, я просто даю ему ширину. Чтобы он исчез, я установил его ширину в 0.

Аксессуары и основные данные

Аксессуаров вид боли, потому что, если пользователь проверяет что-то от закрывает приложение, они ожидают, что это следует помнить. Поэтому для каждого изменения вам нужно сохранить состояние этих ячеек в CoreData. Я добавил атрибут «состояние» и присвоил ему значение «selected», когда аксессуар должен быть заполнен.

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

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

  • Нет связанных вопросов^_^