2013-04-25 3 views
1

У меня есть пользовательская ячейка местоположения в моем представлении таблицы с помощью кнопки. Когда я нажимаю кнопку, я хочу, чтобы она перешла к деталям пива для этого места. Я использую раскадровку, и я могу заставить его работать, подключив всю ячейку BeerTableViewController со следующим кодомSeegue TableViewCell с UIButton

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([[segue identifier] isEqualToString:@"beer"]){ 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     BeerTableViewController *beer = (BeerTableViewController *)[segue destinationViewController]; 
     Location *location = [self.location_results objectAtIndex:indexPath.row]; 
     beer.location_id = location.location_id; 
     beer.location_name = location.location_name; 
     } 

} 

, но когда я создаю SEGUE с кнопки вместо всей клетки всегда перетекает с первая строка, независимо от того, какая строка нажата. Очевидно, я не пропускаю проход в строке с нажатием кнопки. Я рассмотрел ряд решений здесь, не найдя ясного ответа. Есть идеи?

Edit 1

Я пытаюсь следующий код в моем TableViewController

-(void)beerTapsPressed:(id)sender { 
    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 
    NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell]; 
    [self performSegueWithIdentifier:@"beer" sender:clickedButtonPath]; 

} 

У меня есть Ctrl + перетащил SEGUE в раскадровку из TableView в DetailView и назвал переход "пиво" и У меня есть кнопка в ячейке под названием «beerTaps», но я все еще получаю только данные строки 1 независимо от того, какую строку я нажимаю.

ответ

4

Это должно работать, если у вас есть SEGUE подключили к кнопке:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([[segue identifier] isEqualToString:@"beer"]) { 
     UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 
     NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell]; 
     BeerTableViewController *beer = (BeerTableViewController *)[segue destinationViewController]; 
     Location *location = [self.location_results objectAtIndex:clickedButtonPath.row]; 
     beer.location_id = location.location_id; 
     beer.location_name = location.location_name; 
    } 
} 

Как правило, лучше не использовать положение кнопки в иерархии представления, чтобы получить ячейку. Лучшим подходом было бы дать кнопке тег в cellForRowAtIndexPath, который равен indexPath.row. Затем в prepareForSegue вы можете просто сделать это:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton *)sender { 
    if([[segue identifier] isEqualToString:@"beer"]) { 
     BeerTableViewController *beer = (BeerTableViewController *)[segue destinationViewController]; 
     Location *location = [self.location_results objectAtIndex:sender.tag]; 
     beer.location_id = location.location_id; 
     beer.location_name = location.location_name; 
    } 
} 
+0

Я закончил тем, что нажал кнопку тега и использовал ваш предложенный метод. Благодаря! – jacobt

2

Вы можете подключить сеанс между контроллером табличного представления и целевым контроллером, после чего вы можете вызвать performSegueWithIdentifier, когда кто-то нажат на кнопку. Что касается общения с indexPath клетки, в которой прослушивается кнопка, вы могли бы использовать что-то вроде этого:

-(void)buttonPressed:(id)sender { 
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 
NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell]; 


} 

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

+0

Спасибо, я пробую ваше решение, но все еще не хватает. Я отредактировал свой вопрос, чтобы отразить мою попытку. Есть предположения? – jacobt

+0

Это сработало для меня. В моем случае я должен был использовать его как [[[sender superiew] superiew] superiew] cuz У меня есть еще один слой UIView внутри моего contentView UITableViewCell. – EFE

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