#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 :.