2015-10-02 1 views
0

Подпишем мое приложение управляет UITableViewController, где я устанавливаю пользовательские ячейки, являющиеся экземплярами подкласса UITableViewCell.Значение тега UIButton не проходит в методе prepareForSegue в UITableViewController

Одним из свойств этого класса к югу является UIButton называется flameRelation:

@property (weak) IBOutlet UIButton* flameRelation; 

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

Для достижения этой цели, я смотрю на следующий 2-шагового подхода:

1) Так как мне нужно знать indexpath.row ячейки, где была нажата кнопка FlameRelation, я установил, что тег кнопка в методе UITableView, который устанавливает каждую клетку моего корма следующим образом:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //Set a bunch of things before setting UIButton flameRelation tag 

    [cell.flameRelation setTag:indexPath.row]; 

И я печатая тег, который позволяет мне проверить, что тег создается, когда я прокручиваю вниз мой канал после запуска моей сборки (Я вижу числа, увеличивающиеся при прокрутке вниз, как и ожидалось).

NSLog(@"The button tag for this cell is set to %ld",(long)[cell.flameRelation tag]); 

2) В способе prepareForSegue, что позволяет пользователю переходить к контроллеру вида детали с соответствующей информацией, я проверить класс отправителя первым. Если класс отправителем является UIButton, я пытаюсь передать нужную информацию в контроллер представления детали, установив значение indexpath к значению тега:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if([segue.identifier isEqualToString:@"FlameDetail"]) { 
    FlameDetailViewController* flameDetailController = (FlameDetailViewController*) segue.destinationViewController; 

    if ([sender isKindOfClass:[FlameCellTableViewCell class]]) 
    { 
    NSIndexPath* indexPath = [self.tableView indexPathForCell:sender]; 
    NSLog(@"The indexPath is: %@", indexPath); 

    flameDetailController.flame = [self.feed flameAtIndex:indexPath.row]; 

    NSLog(@"class for object sender: %@", NSStringFromClass([sender class])); 
    } 


    else if ([sender isKindOfClass:[UIButton class]]) 
    { 
     NSLog(@"The button tag is set to %ld",(long)[sender tag]); 
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
     NSLog(@"The indexPath from UIButton is: %@", indexPath); 

     flameDetailController.flame = [self.feed flameAtIndex:indexPath.row]; 
     NSLog(@"The value of indexPath.row is %ld",(long)indexPath.row); 

     NSLog(@"class for object sender: %@", NSStringFromClass([sender class])); 
     flameDetailController.findOutView.hidden = NO; 
     [flameDetailController.flameAction setTitle:@"CHAT NOW" forState:UIControlStateNormal]; 
     NSLog(@"Yes, the sender is UIButton"); 
     NSLog(@"The title of flameAction is set to %@", flameDetailController.flameAction.titleLabel.text); 
    } 
} 

Все работает хорошо, если я нажимаю на сама ячейка, но если я нажму кнопку пламениRelation, я вижу в своих журналах, что метка getter on возвращает 0. Который, очевидно, не передает правильную информацию в контроллер целевого представления.

Спасибо!

+0

В prepareForSegue, это условный оператор UIButton выполнить? Если вы поставили точку останова, имеет ли значение sender.tag значение? – brandonscript

+0

Вы говорите утверждение 'IndexPath от UIButton:' всегда печатает 0? – Abhinav

+0

Привет @remus и Abhinav: Да, [тег отправителя] всегда установлен в 0. Условный оператор UIButton выполняется, и когда я печатаю значение тега, я вижу 0. Это не нормально. – renaissance17

ответ

0

Прежде всего, почему вы преобразовываете значение вашего тега в indexPath, а затем получаете данные своей модели с номером строки?

Ваш код:

NSIndexPath* indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
flameDetailController.flame = [self.feed flameAtIndex:indexPath.row]; 

Попробуйте вместо этого:

flameDetailController.flame = [self.feed flameAtIndex:sender.tag]; 

Я не вижу причин, почему этот подход не будет работать. Если это не так, вам нужно поделиться больше кода/деталей.

Однако, я хотел бы предложить еще один альтернативный (не настолько велика, хотя):

UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 
NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell]; 
+0

Абхинав: Похоже, мы в пути. Ваша первая рекомендация не работает (sender.tag создает ошибку, и тег все равно печатает 0). Второй лучше (тег больше не равен 0), но свойства, которые я хочу передать, равны нулю. См .: [link] (https://www.dropbox.com/s/xjs99wv9wmg3t2o/Screenshot%202015-10-02%2010.57.24.png). В очередной раз благодарим за помощь! – renaissance17

+0

Abhinav, @remus: Спасибо за вашу помощь. Это заставило меня больше думать о решениях, и я нашел его. Из-за жизненного цикла контроллера зрения я назвал представление из контроллера детали, а затем установил розетки. Я просто вызываю представление с помощью '[segue.destinationViewController view]:' Да! – renaissance17