2015-06-26 3 views
1

У меня есть UITableView с настраиваемыми ячейками в нем. У каждой ячейки есть переключатель, и мне нужно получить индексную ячейку определенной ячейки каждый раз, когда с ней взаимодействует коммутатор. Как я могу вернуть indexPath ячейки из UITableView с настраиваемыми ячейками каждый раз, когда коммутатор взаимодействует?Получение indexPath от включения UITableView

+0

Вы создали свою ячейку программно или через IB? – dasblinkenlight

+0

@dasblinkenlight Ячейки были созданы, создавая файл .xib и связывая его с подклассом UITableViewCell, где я все настраивал, а затем я использовал методы tableview для заполнения таблицы ячейками (не уверен, что это ответ, который вы искали потому что дайте мне знать) – ACR

+0

Если у вас есть один раздел, вы можете установить свойство «Tag» этого переключателя в строку пути индекса при заполнении таблицы ячейками. – dasblinkenlight

ответ

7

Вы можете использовать indexPathForRowAtPoint как:

@IBAction func switchChanged(sender: UIControl) { 
    let rowPoint = sender.convertPoint(sender.frame.origin, toView: self.tableView) 
    let indexPath = self.tableView.indexPathForRowAtPoint(rowPoint) 
    println(indexPath) 
} 

Это Objective C версии

- (IBAction)toggleSwitch:(id)sender { 
    UISwitch *switchInCell = (UISwitch *)sender; 
    CGPoint pos = [switchInCell convertPoint:[switch frame].origin toView:tableView]; 
    NSIndexPath *indexPath = [[self tableView] indexPathForRowAtPoint:pos]; 
} 

Если вы хотите получить indexPath ячейки в пользовательской ячейке:

// CustomCell.swift 
@IBAction func switchChanged(sender: UIControl) { 
    let tableView = self.tableView() 
    let indexPath = tableView?.indexPathForCell(self) 
    println(indexPath) 
} 

func tableView() -> UITableView? { 
    var tableView = self.superview 
    while (tableView != nil && !(tableView is UITableView)) { 
     tableView = tableView!.superview 
    } 

    return tableView as? UITableView 
} 
+0

Но это действительно лучший вариант. –

+0

Поскольку мой tableView находится в другом классе, чем класс моей пользовательской ячейки, как мне работать с 'toView: self.tableView' в' sender.convertPoint'? – ACR

+0

@ACR Вы хотите получить indexPath внутри ячейки? – Bannings

0

Один способ, я могу думать, чтобы решить это

EDIT Это может работать в iOS6 или старше

- (void)toggleSwitch:(id)sender { 
    UISwitch *switch = (UISwitch *)sender; 
    UITableViewCell * cell = (UITableViewCell*) switch.superview; 
    NSIndexPath *indexpath = [[self yourTableView] indexPathForCell:cell]; 
} 
+0

Это опасно.Различные версии iOS могут иметь различное количество просмотров между отправителем и ячейкой. – Bannings

+0

@Bannings Правда, хотя вы не могли бы пройти через свои наблюдения и искать UITableViewCell? –

+0

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

0

Одна секция TableView: в методе cellForRowAtIndexPath вы можете установить тег переключателя то текущей ячейки, как cell.switch.tag = indexPath.Row и в методе переключая вы может получить метку вашего коммутатора

- (void)toggleSwitch:(id)sender { 
UISwitch *switch = (UISwitch *)sender; 
int row = switch.tag; 
//you can switch on the switch values to to get the exact switch then do your action 
} 

Мульти секции Tableview: Создайте собственный класс коммутатора, который имеет свойство NSIndexPath, а затем в методе cellForRowAtIndexPath вы можете установить это свойство с помощью указателя фактической ячейки, но не забудьте сбросить это свойство в методе prepareForReuse в пользовательской ячейке. и в вашем методе переключения вы получите фактическое indexPath

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