it-swarm.com.ru

IOS 7 - Как получить indexPath от кнопки, размещенной в UITableViewCell

Я программно создал UITableView и добавил UISwitch к его представлению аксессуаров для ячеек. 

Это мой код для UISwitch в представлении ячейки в методе cellForRowAtIndexPath.

UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[accessorySwitch setOn:NO animated:YES];
[accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = accessorySwitch;

Это метод, который вызывается после нажатия кнопки.

- (void)changeSwitch:(UISwitch *)sender{

    UITableViewCell *cell = (UITableViewCell *)[sender superview];

    NSIndexPath *indexPath = [self.filterTableView indexPathForCell:cell];
    NSLog(@"%ld",(long)indexPath);

 ……………. My other code…….
}

Я могу напечатать значение пути индекса в iOS 6 Но в iOS 7 он печатает ноль,

Я что-то упустил в iOS 7 или есть какой-то другой способ получить indexPath в iOS 7 

Спасибо, Arun.

29
Arun

NSLog(@"%ld",(long)indexPath); неверно, это напечатает адрес указателя indexPath

попробуйте использовать следующие коды

CGPoint center= sender.center; 
  CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.filterTableView];
  NSIndexPath *indexPath = [self.filterTableView indexPathForRowAtPoint:rootViewPoint];
  NSLog(@"%@",indexPath);
63
lanbo

Swift solution: Расширение UITableView, подобное этому, может быть полезно для этого.

extension UITableView {
    func indexPathForView(view: AnyObject) -> NSIndexPath? {
        let originInTableView = self.convertPoint(CGPointZero, fromView: (view as! UIView))
        return self.indexPathForRowAtPoint(originInTableView)
    }
}

Использование становится легким везде.

let indexPath = tableView.indexPathForView(button)
7
Ishan Handa

Если у вас есть кнопка в клетке. Вы можете получить камеру, позвонив в Superview. И тогда можно получить Indexpath этим способом.

 (void)obButtonTap:(UIButton *)sender {

    UITableViewCell *cell = (UITableViewCell *)sender.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}
6
Adnan Aftab

Вы можете назначить теги для каждого переключателя в методе cellForRowAtIndexPath, например:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
   UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
   [accessorySwitch setOn:NO animated:YES];
   [accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
   cell.accessoryView = accessorySwitch; 
   accessorySwitch.tag = indexPath.row;    
}

- (void)changeSwitch:(UISwitch *)sender{
    NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:[sender tag]];
    NSLog(@"%ld",(long)indexPath);
}
4
Janak Nirmal

Свифт 4:

extension UITableView {
    func indexPathForView(view: AnyObject) -> NSIndexPath? {
        let originInTableView = self.convert(CGPoint.zero, from: (view as! UIView))
        return self.indexPathForRow(at: originInTableView)! as NSIndexPath
    }
}
2
Logic

Swift 4 Conversion, создает глобальное расширение:

extension UITableView {
    func indexPathForView(view: UIView) -> IndexPath? {
            let originInTableView = self.convert(CGPoint.zero, from: (view))
            return self.indexPathForRow(at: originInTableView)
        }
}

Пример использования:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = ...
cell.myButton.addTarget(self, action: #selector(myButtonAction(_:)), for: .primaryActionTriggered)
return cell

    }

@objc func myButtonAction(_ button:UIButton) {

        guard let ip = self.tableView.indexPathForView(view: button) else {
            return
        }
}
1
Chris

Вы, вероятно, обожглись, предполагая, что параметр superview будет tableViewCell. Возможно, в iOS 7 они изменили иерархию, чтобы добиться какого-то визуального эффекта; может быть, там есть новый вид. 

Вы могли бы подкласс UISwitch и дать ему свойство indexPath. Затем в вашем cellForRowAtIndexPath назначьте его туда, чтобы у вас была ссылка. 

1
D.C.

Я думаю, что опасно полагаться на положение кнопки, чтобы узнать, какая из них была нажата. 

Я предпочитаю создать словарь, используя в качестве ключа саму кнопку/переключатель, а в качестве значения указатель пути: 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
...
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:[cell settingSwitch]];
    [[self switchIndexDictionary]setObject:indexPath accessorySwitchKey];
...
}

затем, когда переключатель/кнопка срабатывает, я легко получаю путь индекса из своего словаря: 

- (void)toggleSetting:(id)sender
{
    UISwitch *selectedSwitch = (UISwitch *) sender;

    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:selectedSwitch];
    NSIndexPath *indexPath = [[self switchIndexDictionary]objectForKey: accessorySwitchKey];
}
0
Omaty