prepareforsegue vs didselectrowatindexpath

时间:2015-04-24 04:07:59

标签: ios objective-c uitableview

我目前正在构建一个向下钻取的桌面视图,我遇到了一些问题。我使用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];
    }
}

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

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

这可以帮助你。

享受编码!!