2013-09-03 8 views
0

Я застрял в этой проблеме. У меня есть раскадровка с несколькими контроллерами.Как передавать данные между контроллерами не соседнего вида в Storyboard

Что мне нужно сделать, это: Мне нужно передать массив из FirstViewController в SecondViewController (они не являются соседями и не связаны через Segue), где PikerView будет загружать массив. После этого выбранный результат должен быть передан ThirdViewController. У меня есть вкладка, в которой FirstViewController и SecondViewControllers подключены к контроллеру панели табуляции, а ThirdViewController подключен к SecondViewController через Push Segue.

Посмотрите, как я стараюсь передать данные формы первого ко второму

CategoryExpencesViewController.h

#import <UIKit/UIKit.h> 
#import "AddCategoryViewController.h" 
#import "CategoryPickerViewController.h" 
@interface CategoryExpencesViewController : UITableViewController   <AddCategoryViewControllerDelegate> 
@property(nonatomic, weak) IBOutlet UIBarButtonItem *editButton; 
@property(nonatomic, strong) NSMutableArray *categories; //list of category items 
@property(nonatomic, strong) NSMutableArray *listOfCategories; //list of category names 

CategoryExpencesViewController.m

-(void)updateArray 
{ 
CategoryPickerViewController *controller = [[CategoryPickerViewController alloc]init]; 
controller.categoryList = [[NSMutableArray alloc]init]; 
controller.categoryList = listOfCategories; 
NSLog(@"%d", [listOfCategories count]); 
NSLog(@"%d", [controller.categoryList count]); 

} 
+2

Поместите данные в объект модели. Сообщите диспетчерам представлений о объекте модели. Используйте бит KVO для обнаружения изменений. – trojanfoe

+0

Pls расскажите мне больше о модели объекта. Я новичок в Objective C, поэтому пропустите знания. Спасибо! – user2724321

+0

Поиск MVC на веб-сайте разработчика Apple; вы получите * много * хитов. – trojanfoe

ответ

0

Я думаю, что вам нужно this

Используйте свой Push Segue.

segue.sourceViewController (или самостоятельно) укажет на SecondViewController. segue.sourceViewController.tabBarController будет указывать на контроллер панели вкладок.

Из контроллера панели вы найдете FirstViewController.

-2

Вы думаете о NSUserDefault, попробуйте, и вы также можете создать глобальную переменную экземпляра в классе AppDelegate и получить к ней доступ, создав экземпляр AppDelegate в любом другом ViewController, но я думаю, что NSUserDefault - лучший вариант для всех.

+0

Это нехорошее решение и его не следует рассматривать. – mattyohe

0

Я полагаю, вы решили бы, но я этот пост только для записи:

Wrap массив в класс, и сделать это иметь статический метод строительства:

Wrapper.h:

@property (nonatomic, strong) NSMutableArray* array; 
    +(Wrapper*)createArray; 

Wrapper.m:

+(Wrapper*)createArray{ 
     static Wrapper* instance = nil; 
     if (instance == nil) { 
      instance = [[Wrapper alloc] init]; 
      //Your initialization code for the array 
     } 
     return instance; 
    } 

Тогда в вашем FirstViewController:

-(void)updateArray{ 
     CategoryPickerViewController *controller = [[CategoryPickerViewController alloc]init]; 
     controller.categoryList = [[NSMutableArray alloc]init]; 
     controller.categoryList = [[Wrapper createArray] array]; 
     NSLog(@"%d", [listOfCategories count]); 
     NSLog(@"%d", [controller.categoryList count]); 

    } 

Поскольку это первый вызов Wrapper, создается массив. Затем в SecondViewController, когда вы звоните:

secondView.categoryList = [[Wrapper createArray] array]; 

и вы получите тот же массив, как и в FirstViewcontroller.

Смежные вопросы