Передача содержимого массива из одного класса в другой

#iphone

#iPhone

Вопрос:

У меня есть массив, заполняющий небольшое TableView в классе DetailView, и когда пользователь нажимает кнопку, мне нужно, чтобы массив был отправлен на другой контроллер представления, чтобы заполнить там TableView, но у меня возникают некоторые трудности с его работой. Это то, что я пытался сделать до сих пор:

 *DetailViewController.m*

    #import "DetailViewController.h"
    #import "OtherViewController.h"


-(IBAction) toCart:(id)sender {

    OtherViewController *oVC = [[OtherViewController alloc] init];
    oVC.shoppingList = sList;
    NSLog(@"Ingredients count %d", [sList count]); //This returns a number, so the sList definitely contains values, and the method is definitely being called.
    [oVC release];

}
  

 *OtherViewController.m*

    #import "OtherViewController.h"
    #import "DetailViewController.h"

    @synthesize shoppingList;

-(void) viewWillAppear: (BOOL)animated {
    NSLog(@"list count: %d", [shoppingList count]); // This returns 0

}
  

sList заполняется в другом месте класса, а sList и ShoppingList оба объявлены в их соответствующих файлах .h с помощью @property (неатомный, сохранить)…

Любая помощь высоко ценится!

Комментарии:

1. когда вы переходите к другому представлению? в выбранном ли методе TableView?

2. Нет, извините, я, вероятно, должен был упомянуть. OtherViewController находится на другой вкладке панели вкладок.

3. Это topViewController этой вкладки?

Ответ №1:

Поскольку у вас есть taBbarcontroller , таким образом, вы можете поступить следующим образом :

Создайте ссылки вашего you viewControllers (которые связаны с tabbar as topViewController ) в вашем appDelegate .

 otherViewController = [[tabBarController.viewControllers objectAtIndex:<tabIndex>] topViewController];
  

сделайте это как @property в AppDelegate, чтобы вы могли получить к нему доступ в любом месте вашего приложения.

теперь,

 -(IBAction) toCart:(id)sender {

    //appDelegate <--- get reference to your application delegate using [[UIApplication sharedApplicaiton]delegate] do not forget to properly type cast it.

    OtherViewController *oVC = [appDelegate otherViewController];
    oVC.shoppingList = sList;
    NSLog(@"Ingredients count %d", [sList count]); 
//This returns a number, so the sList definitely contains values, and the method is definitely being called.
   // [oVC release]; no need to release it...

}


//also make sure you do not initialize shoppingList of otherViewController in viewDidLoad(or any other method) of otherViewController, else it will be overwritten(lost its previous reference).
  

в вашей appDelegate's .h записи

 @property OtherViewController *otherViewController;
  

в appDelegate's.m

 @synthesize otherViewController;
  

в appDelegates ‘s . m (метод didFinishLaunchingWithOptions : ) запись

 otherViewController = [[tabBarController.viewControllers objectAtIndex:<tabIndex>] topViewController];
  

Спасибо

Комментарии:

1. Хорошо, я думаю, что понимаю, но я не уверен, куда в моем AppDelegate поместить строку otherViewController = [[TabBarController.ViewControllers objectAtIndex:<tabIndex>] topViewController]; и как объявить ее как @property. Спасибо!

2. Спасибо за обновление кода! Но когда я помещаю @property OtherViewController *otherViewController; в файл .h, я получаю сообщение об ошибке «Неизвестное имя типа ‘OtherViewController’. Там должно быть что-то еще, или я просто идиот? Кроме того, что входит в часть <tabIndex>? Это третья вкладка, так что мне просто поставить ‘2’ (предполагая, что индекс начинается с 0)? Спасибо за всю вашу помощь до сих пор!

3. вам нужно добавить OtherViewController.h в файл .h вашего AppDelegate .

4. Вы знаете, я подумал, что это то, что мне нужно было сделать 😉 Работает как по маслу, большое спасибо за вашу помощь!

Ответ №2:

В toCart: вы создаете OtherViewController , а затем сразу же выбрасываете его. Что бы OtherViewController ни вызывало -viewWillAppear , это не то, что вы создаете в toCart: . Как создается этот объект и выводится на экран? Вам нужен указатель на него, чтобы изменить его.

Однако лучше было бы переместить данные вашей модели из контроллеров представления и поместить их в один ShoppingCart объект. Тогда все ваши контроллеры просмотра будут иметь ссылку на него (или вы можете создать ShoppingCart синглтон, если это имеет смысл в вашей программе). Таким образом, каждый раз, когда вы меняете корзину покупок из любого места, все представления будут корректно обновляться без необходимости сообщать каждому контроллеру представления о каждом другом контроллере представления.

Комментарии:

1. Я думал, что, создав экземпляр OtherViewController, а затем установив массив ShoppingList (который заполняет табличное представление в OVC) в качестве массива sList, он заполнил бы его в классе OtherViewController?

2. Я полагаю, у вас недопонимание между классами и экземплярами. Вы можете создать множество экземпляров класса, и каждый из них независим. Создание одного и его изменение не влияют на другие. У вас есть другой ViewController, который действует как контроллер для вашего табличного представления. Это не имеет ничего общего с OVC, который вы создали в toCart :.