我目前正在构建一个带有向下钻取的表格 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/