NSIndexPath возвращает ноль

У меня есть UIViewController с табличным представлением. Строка таблицы содержит кнопки, запускающие действие.

//This is my button selector inside tableview delegate cellForRowAtIndexPath

[myBtn addTarget:self action:@selector(onButtonPress:event:)forControlEvents:UIControlEventTouchUpInside];

//This is button action



 -(void)onButtonPress:(UIButton*)sender {
       CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.myTableView];
       NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:buttonPosition];

       DestinationViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationViewController"];
       controller.args=myArgs;
       [self.navigationController pushViewController:controller animated:YES];


 }

//this is my back button action

- (IBAction)onBackPressed:(id)sender {
     [self.navigationController popViewControllerAnimated:YES];
}

Сначала все работает нормально, но после того, как я перешел к другому ViewController и вернулся к контроллеру tableview, нажав кнопку «Назад» и снова нажав кнопку строки таблицы, NSIndexPath равно нулю

я пробовал это indexPathForRowAtPoint возвращает ноль только для первой ячейки в подходящий вид


person Askarc Ali    schedule 28.10.2015    source источник


Ответы (5)


Попробуйте отправить делегата в nextviewcontroller, например

   DestinationViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationViewController"];
   controller.args=myArgs;
   controller.delegate = self;
   [self.navigationController pushViewController:controller animated:YES];

и при переходе от этого viewController к текущему контроллеру представления таблицы передайте этот делегат.

Это может помочь вам...

person RStack    schedule 12.11.2015
comment
спасибо за ваше предложение. как я могу вернуться? Вы можете дать мне образец? потому что все мои данные в этом должны сохраниться. - person Askarc Ali; 12.11.2015
comment
Можете ли вы показать мне код, с помощью которого вы переходите к текущему контроллеру представления, и код, с помощью которого вы показываете следующий контроллер представления. - person RStack; 13.11.2015
comment
controller.delegate = self; добавьте эту строку в свой код - person RStack; 16.11.2015

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

Конечно, нет IndexPath, так как вы никогда не нажимали на ячейку. В основном вы игнорируете полный механизм просмотра таблиц.

При создании tableviewcell пометьте кнопки индексом. Не лучший подход, но сойдет.

person Helge Becker    schedule 28.10.2015
comment
я сказал после того, как я нажал кнопку, которая находится внутри строки моей таблицы (myBtn) - person Askarc Ali; 28.10.2015

Установите тег кнопки равным indexPath.row и найдите NSIndexPath из тега.

myBtn.tag=indexPath.row;
[myBtn addTarget:self action:@selector(onButtonPress:)forControlEvents:UIControlEventTouchUpInside];

-(void)onButtonPress:(UIButton*)sender {

UIButton *btnSender =(UIButton *)sender;

 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:btnSender.tag inSection:0];

}
person darshan    schedule 28.10.2015

Я предлагаю вам написать [tableView reload] в разделе «viewWillAppear»; Или используйте другой способ, например, блок для реализации

person jerry    schedule 28.10.2015
comment
даже я сделал это но бесполезно - person Askarc Ali; 28.10.2015

Я не буду использовать метод indexPathForRowAtPoint: для получения indexPath. Вы можете заархивировать его другим способом. Сначала добавьте категорию UIView:

Заголовочный файл:

#import <UIKit/UIKit.h>

@interface UIView (TableCell)

-(UITableViewCell*)getTableCell;

@end

и реализация

@implementation UIView (TableCell)

-(UITableViewCell *)getTableCell
{
   while (self.superview) {
      if ([self.superview isKindOfClass:[UITableViewCell class]]) {
         return (UITableViewCell*)self.superview;
      }else {
         return [self.superview getTableCell];
      }
   }
   return nil;
}

Теперь в вашем onButtonPress: вы можете сделать так:

UITableViewCell *cell = [sender getTableCell];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]
person sahara108    schedule 28.10.2015
comment
чем отличается этот метод - person Askarc Ali; 28.10.2015
comment
Ваш метод основан на макете представления и может не работать, если макет еще не завершен. Этот метод гарантирует возврат индекса всякий раз, когда у вас есть ячейка. - person sahara108; 28.10.2015
comment
Я новичок в платформе iOS, объясните, пожалуйста, как мне это реализовать. - person Askarc Ali; 28.10.2015
comment
таким образом, теперь я получаю свою ячейку UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; - person Askarc Ali; 28.10.2015
comment
таким образом я получаю кнопку btn=(UIButton*)[cell viewWithTag:111]; - person Askarc Ali; 28.10.2015
comment
Нет, это неправильно. Я сейчас на мобильном телефоне, поэтому трудно редактировать ответ. Вы можете поискать, как реализовать категорию в ios и попробовать. Я отредактирую ответ, когда вернусь к своему компьютеру - person sahara108; 28.10.2015
comment
Быстрый способ сделать это — cell = sender.superView.superView.superView. - person sahara108; 28.10.2015
comment
Но это для ios 7. Вы должны попробовать вызвать superView, пока не найдете UITableViewCell - person sahara108; 28.10.2015
comment
Из того, как вы получаете кнопку из ячейки, это должен быть sender.superView, чтобы вернуть ячейку. - person sahara108; 28.10.2015
comment
Давайте продолжим обсуждение в чате. - person sahara108; 28.10.2015