Я люблю MVC, но я не абсолютный пурист до такой степени, что причиняю себе боль при выполнении довольно тривиальной задачи, поэтому ответы, которые вы получили здесь, хорошие и полезные. Однако, создавая ivar для ссылки на определенный тип, такой как метка или другой контроллер представления, вы объединяете вещи, которые не нужно соединять. Вместо этого вы можете сделать свой первый контроллер представления вкладок делегатом вашего второго контроллера представления вкладок. Так что сделайте что-то подобное в вашем делегате приложения.
OptionsViewController *optionsViewController = // ... get this from the tab view
FirsTabViewController *firstTabViewController = // ... same here
[optionsViewController setDelegate:firsTabViewController];
Это означает, что вам нужен ивар в вашем OptionsViewController:
@property (assign) id delegate;
Затем, когда любое событие, которое вы хотите вызвать, происходит в вашем контроллере представления параметров, посмотрите, может ли делегат ответить на селектор, который вы назвали. Например:
- (void)someEventHappenedLikeTyping:(id)sender;
{
if ([delegate respondsToSelector:@selector(setOptionsString:)]
[delegate performSelector:@selector(setOptionsString:) withObject:[label text]];
}
Обратите внимание, что вы никогда не указывали какие-либо конкретные типы объектов. Вы просто проверяете, может ли делегат (который был объявлен как id) ответить на этот селектор. Если это возможно, он делает то, что ему говорят, и просто молчит в противном случае.
Чтобы это работало, вам нужен ivar для optionsString в вашем FirstTabViewController, и поэтому он будет объявлен в заголовке как:
@property (copy) NSString *optionsString;
и затем @synthesize в .m. Это приводит к тому, что -setOptionsString становится допустимым селектором, который будет вызываться в методе -someEventHappenedLikeTyping.
Во всяком случае, теперь, если вам когда-нибудь понадобится изменить какой вид контроллера ссылается на какой, вам не нужно заходить в заголовок и изменять тип ссылочной таблицы ivar. Вам просто нужно внедрить селектор (кстати, это неформальный протокол) в контроллере представления, который является делегатом вашего контроллера представления параметров.
Просто пища для размышлений. Надеюсь, это поможет. В коде, который я добавил, можно выполнить дальнейшее расцепление, но опять-таки это может быть излишним для такой простой задачи. Дайте мне знать, если вам нужно разъяснение или вы хотите понять, что я имею в виду под дальнейшим разделением.
С уважением,
p.s. Иногда необходимость обмена данными между двумя контроллерами панели вкладок означает, что у вас есть недостаток дизайна. Если вы хотите сохранить настройки в окне параметров, просто позвоните
[[NSUserDefaults standardUserDefaults] setObject:[label text] forKey:@"option1"];
[[NSUserDefaults standardUserDefaults] synchronize];
Затем вы можете вытащить NSUserDefaults обратно на главную вкладку с помощью
NSString *option1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"option1"];
// Do something with option1