prepareforsegue vs didselectrowatindexpath

我正在构建一个下钻的桌面视图,我遇到了一些问题。 我正在使用prepareforsegue调用下一个视图,我正在使用didselectrowatIndexpath将数据从源视图传递到目标视图。

我有以下问题:1)当我选择一个单元格时,在didSelectRowAtIndexPath之前调用prepareforsegue,这意味着在我的数据传递到下一个视图之前调用视图2)我在didselectrowatIndexpath中有一个performseguewithidentifier,它似乎两次调用segue(一次使用prepareforsegue初次调用,第二次调用performseguewithidentifier)。

使用storyboard将数据从一个tableview传递到另一个tableview的最佳实践是什么?调用下一个视图的最佳方法是什么?

以下是我的一些代码:

- (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]; } } 

在某些情况下,例如,您必须根据indexPath或其他逻辑决定执行哪个segue,您必须使用didSelectRowAtIndexPath,并调用performSegueWithIdentifier。 但是,当您这样做时,您需要将segue从控制器转到下一个视图控制器,而不是从单元格(这可能是您的错误)。

如果任何单元格的选择偏离同一个控制器,那么最好直接从单元格中生成segue,实现prepareForSegue,而不是实现didSelectRowAtIndexPath(除非你有另外的理由这样做,与将数据传递给下一个无关控制器)。 如果你这样做,你不应该调用performSegueWithIdentifier。 在prepareForSegue:sender:sender参数将是单元格,因此您可以使用表视图方法indexPathForCell:来获取indexPath,您可以使用它来查询模型以便将数据传递到目标视图控制器。

它认为,你已经从UITableViewCell创建了从UITableView到nextview的segue,这导致了这个问题。

您需要在视图之间设置segue (通过连接其视图控制器,选择firstview,从顶部黄色圆圈到下一个视图拉伸segue)。

愿这对你有所帮助。

享受编码!!