ios - prepareforsegue 与 didselectrowatindexpath

标签 ios objective-c uitableview

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

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

使用 Storyboard将数据从一个 TableView 传递到另一个 TableView 的最佳做法是什么?调用下一个 View 的最佳方式是什么?

这是我的一些代码:

- (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。但是,当您这样做时,您需要从 Controller 到下一个 View Controller 进行 segue,而不是从单元格(这可能是您的错误所在)。

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

关于ios - prepareforsegue 与 didselectrowatindexpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838537/

相关文章:

ios - 将图像添加到 uitableview 单元格

iphone - 如果 UITableViewCell 不可见则为 nil

ios - 如何以编程方式区分 iOS 中的公共(public) API 与未记录/私有(private) API?

ios - 如何检查方法 systemFontOfSize(fontSize : weight:) exist in iOS

iphone - 在 AVQueuePlayer 中寻找时间

objective-c - iOS:当我将 AppDelegate.h 包含到另一个头文件中时,什么会导致 Xcode 编译器抛出错误?

ios - 同一 Controller 中的两个 UITableView

ios - FCM 主题 - 无法订阅主题 : xxx with token: (null) - iOS

android - 有没有办法从对服务器的http请求确定移动操作系统(iOS、Android等)?

ios - 将位置数组保存到 NSUserDefaults