См. Мой ответ здесь: Как сохранить обязательный раздел подпредставления в основное представление, основанное на выборе ячеек таблицы
Идеальным решением является создание протокола и с использованием делегата для передачи информации в иерархии контроллера представления. Это позволяет избежать сильной связи, которая происходит в вашем примере, когда вы возвращаетесь к self.parentViewController.navigationController
. Что произойдет, если родительский контроллер представления изменится в будущем или вы захотите повторно использовать контроллер выбора в другом месте приложения? Новый контроллер представления, который является родительским, может быть экземпляром класса, отличного от RoutineDayTableViewController
, и может не иметь свойства exerciseURL
.
Для этого конкретного примера я бы сделал что-то вроде следующего:
Добавить определение протокола внутри SpecificExerciseTableViewController.h
@class SpecificExerciseTableViewController;
@protocol SpecificExerciseTableViewControllerDelegate <NSObject>
@optional
- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
@end
Добавить свойство внутри MuscleTableViewController.h
@property (nonatomic, weak) id delegate;
Добавить свойство внутри SpecificExerciseTableViewController.h
@property (nonatomic, weak) id<SpecificExerciseTableViewControllerDelegate> delegate;
Внутри RoutineDayTableViewController.h
#import "SpecificExerciseTableViewController.h"
@interface RoutineDayTableViewController <SpecificExerciseTableViewControllerDelegate>
Внутри RoutineDayTableViewController.m при выделении MusclesTableViewController
экземпляра:
MuscleTableViewController *muscleTableViewController = [[MuscleTableViewController alloc] init];
muscleTableViewController.delegate = self;
Внутри MuscleTableViewController.m при выделении SpecificExerciseTableViewController
экземпляра:
SpecificExerciseTableViewController *specificExerciseTableViewController = [[SpecificExerciseTableViewController alloc] init];
specificExerciseTableViewController.delegate = self.delegate;
Внутри SpecificExerciseTableViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.delegate respondsToSelector:@selector(specificExerciseTableViewController:didSelectSpecificExerciseWithURL:)])
{
NSURL *selectedExerciseURL = [[self.exerciseArray objectAtIndex:selectedRowIndex.row] objectForKey:@"exerciseName"];
[self.delegate specificExerciseTableViewController:self didSelectSpecificExerciseWithURL:selectedExerciseURL];
[self dismissModalViewControllerAnimated:YES];
}
}
Наконец, в вашем RoutineDayTableViewController.m
- (void)specificExerciseTableViewController:(SpecificExerciseTableViewController *)specificExerciseTableViewController didSelectSpecificExerciseWithURL:(NSURL *)exerciseURL;
{
[self addExercise];
}
Пример этого на практике в видео смотрите:
00: 30: 00 мин. Отметка в Видео WWDC 2011 - Знакомство с интерфейсом Builder Storyboarding