2013-06-27 2 views
2

Итак, в основном у меня есть главный контроллер представления - главное меню моего приложения. У меня есть кнопка, которая приводит пользователя к представлению таблицы, где они выбирают что-то, что необходимо применить к основному виду. Проблема в том, что я не знаю, как определить, создается ли главный контроллер представления из сеанса или с самого начала приложения. Есть ли способ проверить это? Должен ли я просто установить логическое значение или строку для проверки метода viewDidLoad, а затем изменить его в prepareForSegue?viewDidLoad: Проверка, если от segue?

+0

Итак, чтобы проверить, хотите ли вы перейти к 'mainViewController' в' tableController', а затем вернуться к исходному 'mainViewController', правильно? Если это так, вы должны: 1. Не хотите создавать новый 'mainViewController', чтобы вернуться к нему. 2. Посмотрите на делегаты/протоколы. В то время есть тонны информации, и именно этого вы захотите. – Firo

+0

Да, но все это инкапсулировано в контроллер навигации. Перейдем к основному виду. Как я узнаю, если он создает новый, и если да, есть ли способ «переходить» обратно в основной корневой режим и переносить данные со мной? Я знаю, что 'popToRootViewControllerAnimated:', чтобы добраться до нижней части стека, но я не знаю, как я приведу данные с ним? – Rob

ответ

3

Итак, теперь, когда я лучше понимаю, что вы после, я могу дать вам более подробный ответ. То, что вы действительно ищете, - это шаблон, связанный с делегатами и протоколами. Это способ отправки данных между 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, так как вы будете использовать ее повсюду. Изучите его хорошо, и вы также можете найти некоторые другие уроки. Как я уже сказал, вы найдете массу их! Я помню, что это чувствовалось для меня подавляющим, когда я впервые узнал об этом, но теперь это всего лишь вторая натура.

+0

Я пропустил эту информацию по причинам простоты и ясности, но на самом деле у меня есть 3 вида таблиц одного и того же подкласса с моего основного вида. Как я могу обработать 'destination.selectionDelegate', так это? Вот почему я поднял поп в корне, потому что мне нужно отскочить от двух столбиков. Поэтому метод 'prepareForSegue' является немного глупым, учитывая, что я не буду переходить к представлению таблицы, в котором мне нужен делегат, пока пара не увидит позже. – Rob

+0

Также может быть что-то, что я не понимаю или что-то еще, потому что я поместил протокол в свой контроллер табличного представления, и когда я пытаюсь установить свой главный контроллер представления в качестве его делегата, он говорит, что протокол не определен. – Rob

+0

@Rob вы просто передадите делегат через каждый tableViewController ('destination.selectionDelegate = self.selectionDelegate'). Он должен по-прежнему работать нормально, и вам все равно придется использовать 'prepareForSegue', чтобы передать делегат, если вы хотите продолжить использование раскадровки. Убедитесь, что вы '# import'' TableViewSuclass' в вашем 'mainViewController'. Я также обновляю popController для обработки вашей ситуации. – Firo

1

Вы также можете проверить [UIApplication sharedApplication] delegate] window] rootViewController], но я, вероятно, просто поеду с недвижимостью.