2015-04-24 3 views
0

В настоящее время я создаю табличное представление с детализацией, и у меня возникают некоторые проблемы. Я использую prepareforsegue для вызова следующего представления, и я использую метод didselectrowatIndexpath для передачи данных из исходного представления в представление назначения.prepareforsegue vs didselectrowatindexpath

У меня есть следующая проблема: 1) Когда я выбираю ячейку, то prepareforsegue вызываются перед didSelectRowAtIndexPath что означает вид вызывается перед моими данные могут быть переданы в следующее представление 2) У меня есть performseguewithidentifier в мой didselectrowatIndexpath, и он, кажется, вызывает segue дважды (после инициализации с помощью prepareforsegue и во второй раз с помощью performseguueithidentifier).

Какова наилучшая практика использования раскадровки для передачи данных из одного табличного представления в другой и как лучше всего вызвать следующий вид?

Вот некоторые из моего кода:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (level == 0) { 
     int muscleID = [muscleIDArray[indexPath.row] intValue]; 
     NSLog(@"MuscleID: %i", muscleID); 
     NSArray *submuscleArray = [self submuscleGroup:muscleID valueForKeyPath:@"submuscleID"]; 
     if (submuscleArray == nil || [submuscleArray count] == 0) { 

      currentMID = muscleID; 
      level = 2; 
      [self performSegueWithIdentifier:@"drillDown2" sender:self]; 
     } else { 
      currentMID = muscleID; 
      level = 1; 
     [self performSegueWithIdentifier:@"drillDown" sender:self]; 
     } 

    } else if (level == 1) { 

     level = 2; 
     currentSMID = [submuscleIDArray[indexPath.row] intValue]; 
     [self performSegueWithIdentifier:@"drillDown2" sender:self]; 

    } else { 
     detailTitle = [[exerciseList valueForKey:[exerciseListSorted objectAtIndex:indexPath.row]] objectAtIndex:0]; 
     exerciseID = [[exerciseListSorted objectAtIndex:indexPath.row] intValue]; 
     [self performSegueWithIdentifier:@"showExerciseDetail" sender:self]; 
    } 


} 

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


    if ([segue.identifier isEqualToString:@"showExerciseDetail"]) { 
     //ExerciseDetail *exerciseDetail = (ExerciseDetail *)segue.destinationViewController; 
     //exerciseDetail.pageTitle = detailTitle; 
     UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
     ExerciseDetail *exerciseDetail = (ExerciseDetail *)navController.topViewController; 
     exerciseDetail.title = detailTitle; 
     exerciseDetail.exerciseID = exerciseID; 
    } else if ([segue.identifier isEqualToString:@"drillDown"] || [segue.identifier isEqualToString:@"drillDown2"]){ 
     //UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
     ExerciseTableViewController *tableView = segue.destinationViewController; 
     tableView.delegate = self; 
     tableView.level = level; 
     tableView.currentSMID = currentSMID; 
     tableView.currentMID = currentMID; 
     NSLog(@"level: %i, currentSMID: %i, currentMID: %i", level, currentSMID, currentMID); 
    } else if ([segue.identifier isEqualToString:@"addExercise"]){ 
     UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
     AddExerciseViewController *addExercise = (AddExerciseViewController *)navController.topViewController; 
     addExercise.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  
    } else if ([segue.identifier isEqualToString:@"dismissView"]){ 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

ответ

5

В таких случаях, как ваш пример, где вам нужно решить, какой сегмент выполнить на основе indexPath или какой-либо другой логики, вам необходимо использовать didSelectRowAtIndexPath и вызвать performSegueWithIdentifier. Однако, когда вы это делаете, вам нужно сделать segue от контроллера до следующего контроллера представления, а не из ячейки (что, вероятно, является вашей ошибкой).

Если вы выбираете любые ячейки для одного контроллера, то, вероятно, лучше всего сделать segue непосредственно из ячейки, реализовать prepareForSegue и вообще не реализовывать didSelectRowAtIndexPath (если у вас нет другой причины для этого, не связанной с передачей данные следующему контроллеру). Если вы сделаете это так, вы не должны вызывать performSegueWithIdentifier. В prepareForSegue: отправитель: аргумент отправителя будет ячейкой, поэтому вы можете использовать метод табличного представления indexPathForCell: получить индексную таблицу, которую вы можете использовать для запроса вашей модели с целью передачи данных в контроллер представления назначения.

+0

помог мне поблагодарить –

0

Это думаю, вы создали SEGUE из UITableViewCell с UITableView к NexTView, которые вызывают эту проблему.

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

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

Наслаждайтесь кодированием !!

+0

Спасибо, что сработал, но у меня все еще есть ошибка, когда я попытался вернуться к предыдущим представлениям. Когда я запускаю приложение, на самом высоком уровне загружаются записи ячеек, как только я развернусь и вернусь, используя верхнюю левую кнопку на панели навигации, предыдущее представление всегда будет пустым. У меня нет никакого popViewController, так как навигационный контроллер, похоже, способен заботиться о том, чтобы идти туда и обратно. Должен ли я иметь popViewController в моем коде, чтобы не было предыдущего представления? –

+0

Вы добавили пользовательские обратно, с пользовательским видом в NavigationController? –