【问题标题】:prepareforsegue vs didselectrowatindexpathprepareforsegue vs didselectrowatindexpath
【发布时间】:2015-07-02 12:42:27
【问题描述】:

我目前正在构建一个向下钻取的表格视图,但遇到了一些问题。我正在使用 prepareforsegue 调用下一个视图,并且正在使用 didselectrowatIndexpath 将数据从源视图传递到目标视图。

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

使用故事板将数据从一个表视图传递到另一个表视图的最佳做法是什么?调用下一个视图的最佳方法是什么?

这是我的一些代码:

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

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      它认为,您创建了从UITableViewCellUITableView 到nextview 的segue,这导致了这个问题。

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

      希望对您有所帮助。

      享受编码!

      【讨论】:

      • 谢谢它的工作,但当我试图返回到以前的视图时我仍然有一个错误。当我启动应用程序时,最高级别会加载单元格条目,一旦我使用导航栏中的左上角按钮向下钻取并返回,上一个视图总是变为空白。我没有调用任何 popViewController,因为导航控制器似乎能够处理来回。我是否需要在我的代码中添加 popViewController 以免之前的视图出现空白?
      • 你有没有把自定义放回去,在 NavigationController 中有自定义视图?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多