我目前正在构建一个向下钻取的桌面视图,我遇到了一些问题。我使用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];
}
}
答案 0 :(得分:5)
在某些情况下,就像您的示例一样,您必须根据indexPath或其他逻辑决定执行哪个segue,您必须使用didSelectRowAtIndexPath,并调用performSegueWithIdentifier。但是,当你这样做时,你需要从控制器到下一个视图控制器,而不是从单元格(这可能是你的错误)。
如果任何单元格的选择偏离同一个控制器,那么最好直接从单元格中生成segue,实现prepareForSegue,而不是实现didSelectRowAtIndexPath(除非你有另外的理由这样做,与传递数据无关)到下一个控制器)。如果你这样做,你不应该调用performSegueWithIdentifier。在prepareForSegue:sender:sender参数将是单元格,因此您可以使用表视图方法indexPathForCell:来获取indexPath,您可以使用它来查询模型以便将数据传递到目标视图控制器。
答案 1 :(得分:0)
它认为,您已经从UITableViewCell
创建了从UITableView
到nextview的segue,这会导致此问题。
您需要在视图之间设置segue
(通过连接其视图控制器,选择第一个视图,从顶部黄色圆圈到下一个视图拉伸segue)。
这可以帮助你。
享受编码!!