2014-11-24 2 views
3

ниже код правильно возвращает ячейку:Найдите кнопку indexPath кнопки внутри UITableViewCell при нажатии кнопки?

func findSuperView(sender:UIButton!) -> UITableViewCell { 
    var superView : UIView? = sender.superview 
    var foundSuperView : UITableViewCell! 

    while superView != nil && foundSuperView == nil { 
     if let cell = superView as? UITableViewCell { 
      foundSuperView = cell 
      break 
     } 
     else { 
      superView = superView?.superview 
     } 
    } 
    return foundSuperView 
} 

Но для нахождения indexpath в Tableview он выходит из строя:

var indexPath : NSIndexPath = self.table .indexPathForCell(findSuperView(sender))! 
println("Section (indexPath)") 

И я попробовал другой путь, но он не был успешным:

var button : UIButton = sender as UIButton; 
var touch: UITouch = events .allTouches()?.anyObject() as UITouch 
var location : CGPoint = touch.locationInView(self.table) 
var indexPath : NSIndexPath = self.table.indexPathForRowAtPoint(location)! 

ответ

0

Я не знаю, есть ли простой способ сделать это. (Редактировать: На самом деле есть. Посмотрите на второе решение @ mustafa.) Обходным решением является установка тега кнопки indexPath.row в cellForRowAtIndexPath, после чего вы можете просто получить доступ к тегу кнопки, чтобы узнать, к какой строке он принадлежит.

Предупреждение: Обходной путь является хрупким. Он не будет работать корректно, если вы разрешите добавлять или удалять строки из таблицы без вызова tableView.reloadData(). Посмотрите на решение @ mustafa, которое является гораздо более надежным.

+0

Спасибо за быстрый ответ, я применил свое решение. Меня устраивает. Но хотелось бы иметь на нем подходящее альтернативное рабочее решение. –

+0

Нет, использование тега на основе indexPath не будет работать, если любые строки могут быть добавлены или удалены. – rmaddy

+0

@rmaddy. Хорошая точка зрения. Я обновил свой ответ, чтобы отметить это. Поскольку другие ответы не работали для ОП, я принял совершенно другой подход в новом ответе. Поскольку мой первоначальный ответ был принят OP, я не хотел его редактировать и создавать впечатление, что мой новый ответ был принят. – vacawama

0

Существует проблема с func findSuperView(sender:UIButton!) -> UITableViewCell. Ничто не гарантирует, что foundSuperView будет иметь значение.

func findSuperView(sender:UIButton!) -> UITableViewCell { 
    var superView : UIView? = sender.superview 
    var foundSuperView : UITableViewCell! // NOTE: The value is nil. 

    while superView != nil && foundSuperView == nil { 
     if let cell = superView as? UITableViewCell { 
      foundSuperView = cell 
      break 
     } 
     else { 
      superView = superView?.superview 
     } 
    } 
    return foundSuperView // NOTE: This will crash if foundSuperView == nil 
} 

Более безопасный способ найти суперэлемент представления возвращает необязательный.

func findSuperCellOfView(view: UIView?) -> UITableViewCell? { 
    if view == nil { 
     return nil 
    } else if let cell = view as? UITableViewCell { 
     return cell 
    } else { 
     return findSuperCellOfView(view?.superview) 
    } 
} 

Который будет использоваться следующим образом.

if let cell = findSuperCellOfView(button) { 
    let indexPath = table.indexPathForCell(cell) 
    println("Section \(indexPath)") 
} 
+0

Спасибо за быстрый ответ, но «table.indexPathForCell (cell)» все равно вернет мне ноль. В моем случае «таблица» подключается через IBOutlet, а кнопка - подзаголовка раздела (TableViewCell). –

10

Вот метод действия кандидата на TouchUpInside события вашей кнопки.

func someAction(sender:UIButton, event: UIEvent) { 
    if let touch = event.touchesForView(sender)?.anyObject() as? UITouch { 
     let point = touch.locationInView(tableView) 
     if let indexPath = tableView.indexPathForRowAtPoint(point) { 
      // Do something with indexPath 
     } 
    } 
} 

А вот еще один:

func someAction(sender: UIButton) { 
    let point = tableView.convertPoint(CGPointZero, fromView: sender) 
    if let indexPath = tableView.indexPathForRowAtPoint(point) { 
     // Do something with indexPath 
    } 
} 
+0

Спасибо за быстрый ответ, но «tableView.indexPathForRowAtPoint (point)» и «tableView.indexPathForRowAtPoint (point)» все равно возвращают мне ноль. В моем случае «таблица» подключается через IBOutlet, а кнопка - подзаголовка раздела (TableViewCell) –

1

Вы, кажется, возникли проблемы с поиском tableView из кода, который обрабатывает @IBAction для вашей кнопки.

Вы можете создать UIButton подкласс, который отслеживает как cell кнопка находится в и UITableView, что ячейка содержится. Тогда это просто вопрос вызова tableView:indexPathForCell в @IBAction для кнопки.

MyButton.swift:

class MyButton: UIButton { 
    weak var myTable: UITableView? 
    weak var myCell: UITableViewCell? 
} 

CustomTableViewCell.swift:

class CustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var myButton: MyButton! 

    @IBAction func whereAmI(button: MyButton) { 
     if let myCell = button.myCell, indexPath = button.myTable?.indexPathForCell(myCell) { 
      print("I am in row \(indexPath.row)") 
     } 
    } 
} 

В TableViewController.скоро:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomTableViewCell 

    cell.myButton.myCell = cell 
    cell.myButton.myTable = tableView 

    // Other cell setup 

    return cell 
} 

Чтобы сделать эту работу, важно установить классы для UIButton и UITableViewCell к MyButton и CustomTableViewCell в Удостоверение инспектора. Также подключите кнопку к ее @IBOutlet в CustomTableViewCell.swift.

0

Если вы используете пользовательский tableViewCell (который вы, вероятно, есть), вы можете просто создать переменную.

class Cell: UITableViewCell { 

    var id = "" 

    @IBAction func buttonPressed(sender: AnyObject) { 
     print(id) // Can also call a function with 'id' as a parameter 
    } 
} 

И:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell: Cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! Cell 

    cell.id = indexPath.row // Or however you wan't to give it an Id 

    return cell 
} 
Смежные вопросы