2013-09-11 5 views
0

У меня большие проблемы с обучением передаче данных с кнопки сотовой ячейки на контроллер подробного представления с помощью segues. Если я нажимаю ячейку данные передаются в контроллер представления подробно в NSString *selectedItem; и этикетки на другие обновления зрения со словом, которое было в клетке -UITableView Accessory Button Segue Не работает

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
     { 
    [self performSegueWithIdentifier:@"toDetail" sender:self]; 
     } 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
      if ([segue.identifier isEqualToString:@"toDetail"]) { 
       NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
       DrugDetailViewController *destViewController = segue.destinationViewController; 
       destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name]; 
      } 
     } 

И я подключить SEGUE на раскадровке из клетка на детальном с именем «toDeatil» это работает, когда я нажимаю ячейку она идет к экрану подробно, но если я ставлю

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
[self performSegueWithIdentifier:@"toDetail" sender:self]; 
    } 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
     if ([segue.identifier isEqualToString:@"toDetail"]) { 
      NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
      DrugDetailViewController *destViewController = segue.destinationViewController; 
      destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name]; 
     } 
    } 

Почти точно такой же, но с accessorybutton и я подключить SEGUE на раскадровке из ячейки accessorybutton до подробного просмотра с названием "toDetail" whe n Я щелкаю по ячейке, которая идет на экран подробностей, но информации там нет, дозатор ярлыков заполняется или просто использует первую деталь ячейки все время.

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

Цель состоит в том, чтобы получить didSelectRowAtIndexPath, идущий на один вид, и accessoryButtonTappedForRowWithIndexPath, идя к другому виду, но мне нужно сообщить accessoryButtonTappedForRowWithIndexPath, какая ячейка была нажата.

Надеюсь, это делает.

Спасибо

+0

Отправить здесь [self performSegueWithIdentifier: @ "toDetail" отправитель: self]; вместо «self» что-то вроде [NSNumber numberWithInt: indexPath.row] и получить это значение в prepareForSegue – nerowolfe

+0

Где я могу получить это значение в файле prepareForSegue? –

+0

NSNumber * sent = (NSNumber *) sender – nerowolfe

ответ

3

Вы можете передать indexPath как sender к performSegueWithIdentifier вызова, например:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"toDetail" sender:indexPath];//IndexPath as sender 
} 

И в методе prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"toDetail"]) { 
     //Detect sender class and act accordingly 
     NSIndexPath *indexPath = [sender isKindOfClass:[NSIndexPath class]] ? (NSIndexPath*)sender : [self.tableView indexPathForSelectedRow]; 
     DrugDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name]; 
    } 
} 
2

Это потому, что [self.tableView indexPathForSelectedRow] будет верните NSIndexPath только в том случае, если ROW нажата, а не при нажатии кнопки аксессуара.

В accessoryButtonTappedForRowWithIndexPath вам необходимо передать indexPath.row методу prepareForSegue вручную. Попробуйте следующее:

NSInteger selectedRow; 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    selectedRow = indexPath.row; 
    [self performSegueWithIdentifier:@"toDetail" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"toDetail"]) 
    { 
     DrugDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.selectedItem = [[candyArray objectAtIndex:selectedRow] name]; 
    } 
} 
+0

Я пробовал это и получил сообщение об ошибке «ожидаемый идентификатор» для этой строки = destViewController.selectedItem = [[candyArray objectAtIndex: selectedRow]] name]; –

+0

на самом деле на самом деле это работает, теперь это случайный двойной]] в коде. Thankyou –

+0

Исправлена ​​ошибка. Благодарю. – Rick

0

Как насчет того, если вы управляете состоянием того, что выбрано на делете приложения! Ответ Рауля Хуареса делает работу, но цель параметра отправителя - другое!

У меня есть приложение, использующее UITableView, и мне нужно знать, какой элемент был затронут на вспомогательной кнопке на экране выше!

Чтобы управлять этим пейзажем, у меня есть одно свойство в делетете приложения, которое я обновляю, когда я прикасаюсь к кнопке аксессуаров для настольных компьютеров; поэтому на следующем экране я могу получить элемент, затронутый при чтении свойства делегата приложения.

В общем, я использую делегат приложения для приложения модели модели (деля нужный класс), поэтому экземпляры представлений взаимодействуют только с этой моделью для обновления необходимых состояний! что я делаю, это работа с фокусом, независимо от работы модели!

Может быть, некоторые, как это:

// Property on Application Delegate 
@propety (atomic,readwrite) NSIndexPath* indexTapped; 

// Method on UITableViewDelegate instance 
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate]; 
    model.indexTapped = indexPath; 
    [self performSegueWithIdentifier:@"toDetail" sender:self]; 
} 

// Method on another View Controller 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate]; 
    if ([segue.identifier isEqualToString:@"toDetail"]) { 
     NSIndexPath *indexTapped = model.indexSelected; 
     DrugDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name]; 
    } 
} 
3

Вам не нужно реализовать accessoryButtonTappedForRowWithIndexPath.

Когда prepareForSegue обжигают из вспомогательного зрения, отправителя: (ID) Параметр отправителя устанавливаются в UITableViewCell, который содержит вид аксессуара. Затем вы можете запросить представление таблицы для индекса этой ячейки (а не выбранного индекса).

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"toDetail"] && [sender isKindOfClass:[UITableViewCell class]]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 
     DrugDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name]; 
    } 
}