2015-10-28 3 views
1

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

//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 returns nil only for first cell in a uitableview

ответ

0

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

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

и при перемещении назад от этой ViewController к данной таблице ViewController передать этот делегат.

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

+0

спасибо за ваше предложение. Как я могу вернуться назад? Можете ли вы дать мне образец ?. потому что все мои данные в этом должны сохраняться. –

+0

Можете ли вы показать мне код, по которому вы переходите к существующему диспетчеру просмотра, и код, с помощью которого вы показываете следующий контроллер представления – RStack

+0

'controller.delegate = self;' добавьте эту строку в свой код – RStack

0

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

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

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

+0

я сказал после того, как я нажал на кнопку, которая находится внутри моей строки таблицы (myBtn) –

0

Установите тег кнопки, равный 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]; 

} 
0

Я не буду использовать метод 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] 
+0

что различные в этом методе –

+0

Ваш метод основан на макете зрения и может не работает, если представление еще не закончено. Этот метод гарантирует возврат индекса, когда у вас есть ячейка. – sahara108

+0

Я новичок в платформе iOS, пожалуйста, объясните, как мне это реализовать. –

0

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

+0

даже я сделал это, но не использовал –