Итак, в основном у меня есть главный контроллер представления - главное меню моего приложения. У меня есть кнопка, которая приводит пользователя к представлению таблицы, где они выбирают что-то, что необходимо применить к основному виду. Проблема в том, что я не знаю, как определить, создается ли главный контроллер представления из сеанса или с самого начала приложения. Есть ли способ проверить это? Должен ли я просто установить логическое значение или строку для проверки метода viewDidLoad, а затем изменить его в prepareForSegue?viewDidLoad: Проверка, если от segue?
ответ
Итак, теперь, когда я лучше понимаю, что вы после, я могу дать вам более подробный ответ. То, что вы действительно ищете, - это шаблон, связанный с делегатами и протоколами. Это способ отправки данных между viewControllers без необходимости знать какие-либо реальные сведения о родительском (или делегированном) контроллере. Это то, что вы захотите сделать.
Для того же ясности я буду использовать два имени для ваших контроллеров, mainViewController
для вашего корневого контроллера и tableViewController
для экземпляра вашего подкласса UITableViewController.
В .h
. из ваших tableViewController
вы хотите настроить протокол:
@protocol SingleSelectionDelegate
- (void)selectionHasBeenChosenWithOption:(NSString *)selection;
@end
@interface MyTableViewControllerSubclass : UITableViewController
// properties and method declarations
// this is your property you will use to send data back to your delegate (in this case your mainViewController)
@property (weak, nonatomic) id<SingleSelectionDelegate> selectionDelegate;
@end
Тогда в .m
(или .h
) вашей mainViewController
вам нужно будет добавить следующее:
// this imports the interface and also the protocol that you want
#import "MyTableViewControllerSubclass.h"
// the <Single...> part says you conform to this protocol and implement the methods it requires (in this case selectionHasBeenChosenWithOption:)
@interface MainViewController <SingleSelectionDelegate>
@end
@implementation MainViewController
// here is where you need to implement the required method
- (void)selectionHasBeenChosenWithOption:(NSString *)selection {
// do what you want with the selection, assign it to a property, call other methods, pass it to other delegates, or whatever else.
// now that you have your information you want the focus to come back to you so you
[self.navigationController popToViewController:self animated:YES]; // works even if not the root
}
// you also need to set yourself as tableViewController's selectionDelegate, if you are using Storyboards you will do this in the prepareForSegue.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.destinationViewController isKindOfClass:[MyTableViewControllerSubclass class]]) {
// you could also check a specific segue's identifier but this makes sense because if it is this subclass then it will have a selectionDelegate property
// assign yourself as the delegate
MyTableViewControllerSubclass *destination = (MyTableViewControllerSubclass *)segue.destinationViewController
destination.selectionDelegate = self;
}
@end
Тогда последний шаг называя делегат, когда у вас есть информация для вашего выбора. Это делается в tableViewController
's .m
. В этом случае я буду делать это в tableView:didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// getting the data you want to send back
NSString dataToSendBack = [self.myArray[indexPath.row] description];
// sending the data to your delegate (in this case mainViewController)
[self.selectionDelegate selectionHasBeenChosenWithOption:dataToSendBack];
// mainViewController is handling the popping so we do not need to do anything with the navigation stack
}
Так что это в основном то, что вы после этого. Я набрал почти все это в текстовом редакторе, чтобы могли быть некоторые синтаксические ошибки. Дайте мне знать, и я могу их исправить. Это научная концепция для iOS Development, так как вы будете использовать ее повсюду. Изучите его хорошо, и вы также можете найти некоторые другие уроки. Как я уже сказал, вы найдете массу их! Я помню, что это чувствовалось для меня подавляющим, когда я впервые узнал об этом, но теперь это всего лишь вторая натура.
Я пропустил эту информацию по причинам простоты и ясности, но на самом деле у меня есть 3 вида таблиц одного и того же подкласса с моего основного вида. Как я могу обработать 'destination.selectionDelegate', так это? Вот почему я поднял поп в корне, потому что мне нужно отскочить от двух столбиков. Поэтому метод 'prepareForSegue' является немного глупым, учитывая, что я не буду переходить к представлению таблицы, в котором мне нужен делегат, пока пара не увидит позже. – Rob
Также может быть что-то, что я не понимаю или что-то еще, потому что я поместил протокол в свой контроллер табличного представления, и когда я пытаюсь установить свой главный контроллер представления в качестве его делегата, он говорит, что протокол не определен. – Rob
@Rob вы просто передадите делегат через каждый tableViewController ('destination.selectionDelegate = self.selectionDelegate'). Он должен по-прежнему работать нормально, и вам все равно придется использовать 'prepareForSegue', чтобы передать делегат, если вы хотите продолжить использование раскадровки. Убедитесь, что вы '# import'' TableViewSuclass' в вашем 'mainViewController'. Я также обновляю popController для обработки вашей ситуации. – Firo
Вы также можете проверить [UIApplication sharedApplication] delegate] window] rootViewController]
, но я, вероятно, просто поеду с недвижимостью.
Итак, чтобы проверить, хотите ли вы перейти к 'mainViewController' в' tableController', а затем вернуться к исходному 'mainViewController', правильно? Если это так, вы должны: 1. Не хотите создавать новый 'mainViewController', чтобы вернуться к нему. 2. Посмотрите на делегаты/протоколы. В то время есть тонны информации, и именно этого вы захотите. – Firo
Да, но все это инкапсулировано в контроллер навигации. Перейдем к основному виду. Как я узнаю, если он создает новый, и если да, есть ли способ «переходить» обратно в основной корневой режим и переносить данные со мной? Я знаю, что 'popToRootViewControllerAnimated:', чтобы добраться до нижней части стека, но я не знаю, как я приведу данные с ним? – Rob