2015-02-04 5 views
1

Я хочу реализовать пользовательский класс UITableViewCell, который состоит из подзонов, таких как метки, кнопки и изображения. Эти ячейки будут отображать контент, полученный из Интернета с использованием API.Обнаруживать UIButton при использовании пользовательского UITableViewCell

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

Кнопка подключается из раскадровки к пользовательскому UITableViewCell через IBOutlet. Метод addTarget(_:action:forControlEvents:) вызывается в UIButton в cellForRowAtIndexPath класса UITableViewController.

Дорожный блок возникает, когда мы хотим обнаружить indexPath выбранной ячейки в функции выбора кнопки.

Это как indexPath для выбранной ячейки может быть обнаружено в функции Selector

@IBAction func doSomething(sender: AnyObject) { 
    var location: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView) 
    var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(location)! 
    println("The indexPath for Selected Cell is - \(indexPath.row)") 
} 

Хотя это успешно получает меня вокруг вопроса, на мой вопрос;

1) Вы обнаружили альтернативный способ использования UIButtons для передачи выбранных данных соты в пользовательский UITableViewCell?

2) Какова была бы лучшая практика до сих пор в Swift для реализации аналогичного сценария?

+0

Кстати ваш отправитель имеет тип 'AnyObject' поэтому вызов' convertPoint: toView' без приведения его к UIView приведет к ошибке компиляции. – Jawwad

+0

Согласен.Я думал, что тоже получаю ошибку компиляции, но упомянутая выше функция @IBAction func работает без таких ошибок. Хотя создание «отправителя» типа «UIView» было бы более чистым подходом. – Lester

+0

Интересно. Возможно, это не дает компиляционной ошибки, поскольку вполне возможно, что отправитель, являющийся AnyObject, может реализовать метод convertPoint: toView. – Jawwad

ответ

1

Если Tableview имеет только один раздел, вы можете использовать tag свойство кнопки для сохранения indexPath.row.

В cellForRowAtIndexPath, когда вы устанавливаете целевое действие для кнопки, установите button.tag = indexPath.row.

Тогда в вашей doSomething рутина:

@IBAction doSomething(sender: UIButton) { 
    println("This button is from row - \(sender.tag)") 
} 
+0

Этот подход также работает. Гораздо более кратким, чем мой подход. – Lester

2

Один из способов будет перебирать superviews отправителя и посмотреть, если UITableViewCell можно найти ...

Допустим, вы создали общий расширение UIView с методом, который будет проверять, чтобы увидеть, если какой-либо из его SuperView-х был UITableViewCell ...

extension UIView { 
    func parentTableViewCell() -> UITableViewCell? { 
     var view = self 
     while let superview = view.superview { 
      if let cell = superview as? UITableViewCell { 
       return cell 
      } else { 
       view = superview 
      } 
     } 
     return nil 
    } 
} 

Тогда вы могли бы сделать следующее ...

if let cell = (sender as UIView).parentTableViewCell() { 
    let indexPath = tableView.indexPathForCell(cell) 
    println("The row for this cell is - \(indexPath.row)") 
} 

Другим способом было бы использовать tag, установив его в Int, а затем проверьте, что в методе tag отправителя.

т.е. в вашем tableView:cellForRowAtIndexPath: методе

cell.myButton.tag = indexPath.row 

Затем в методе doSomething

let rowIndex = (sender as UIButton).tag 
println("The row for this cell is - \(rowIndex)" 
Смежные вопросы