Как вы передаете объекты между контроллерами представления в Objective-C? - PullRequest
5 голосов
/ 05 мая 2010

Я потратил немного кода на два дня, пытаясь понять, почему я не могу извлечь глобальную переменную NSMutableArray, которую я объявил в .h и реализовал в .m и установил в функции viewDidLoad.

Наконец-то меня осенило: в Objective-C нет такой вещи, как глобальная переменная, по крайней мере, не в том смысле, который я знал в PHP.Я никогда не читал предупреждения об ошибках XCode, но это было, даже если не совсем по-английски: «Переменная экземпляра« blah », доступная в методе класса».

Мой вопрос: что я должен делатьДелай сейчас?У меня есть два контроллера просмотра, которые должны получить доступ к центральному NSMutableDictionary, который я генерирую из файла JSON через URL.Это в основном расширенное меню для всех моих развернутых таблиц, и я хотел бы иметь пару других «глобальных» (нестатических) переменных.

Нужно ли мне получать JSON каждый раз, когда я хочугенерировать этот NSMutableDictionary или есть какой-то способ установить его один раз и получить к нему доступ из различных классов через #import?Нужно ли записывать данные в файл, или люди обычно делают это по-другому?

Ответы [ 4 ]

9 голосов
/ 05 мая 2010

Если у вас есть два контроллера представления, которые обращаются к общему NSMutableDictionary, можете ли вы передать указатель на общий словарь в их соответствующие сообщения инициализации?

Итак, в вашем AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
  // the app delegate doesn't keep a reference this, it just passes it to the 
  // view controllers who retain the data (and it goes away when both have been released)
  NSMutableDictionary * commonData = [[NSMutableDictionary new] autorelease];

  // some method to parse the JSON and build the dictionary
  [self populateDataFromJSON:commonData];

   // each view controller retains the pointer to NSMutableDictionary (and releases it on dealloc)
   self.m_viewControllerOne = [[[UIViewControllerOne alloc] initWithData:commonData] autorelease];
   self.m_viewControllerTwo = [[[UIViewControllerTwo alloc] initWithData:commonData] autorelease];
}

И в ваших соответствующих реализациях UIViewControllerOne и UIViewControllerTwo

- (id)initWithData:(NSMutableDictionary*)data
{
    // call the base class ini
    if (!(self=[super init]))
        return nil;

    // set your retained property
    self.sharedData = data;
}

// don't forget to release the property
- (void)dealloc {
    [sharedData release];
    [super dealloc];
}
2 голосов
/ 05 мая 2010

На самом деле существует множество способов сделать это (не прибегая к чему-то экстремальному, например, к записи в файл). Вы можете создать «глобальный» используя:

  1. Старомодные глобальные переменные C (внешние)
  2. A Синглтон класс
  3. переменные экземпляра в делегате приложения

Но все эти подходы делают ваш контроллер представления менее модульным (потому что они зависят от достижения «извне» для поиска глобальных данных), поэтому лучший подход, вероятно, состоит в том, чтобы сделать словарь свойством класса контроллера представления, явно установлен вызывающей стороной (либо в initWithDictionary: метод, либо с отдельным установщиком).

1 голос
/ 05 мая 2010

Просто создайте глобальную переменную. Глобальный означает вне всякой области.

NSMutableDictionary *gDictionary;

@implementation ...
@end
1 голос
/ 05 мая 2010

В Obj-C есть глобальные переменные, вы создаете их экземпляр в App Delegate.

Но для вашей проблемы вы, вероятно, захотите передать NSMutableDictonary, когда создадите новый контроллер представления, например [UIView alloc] initWithDictionary: (NSMutableDictionary *) dict; если вы понимаете, о чем я.

В вашем примере у вас есть один класс, вызывающий другой класс? Я бы подумал, что есть какой-то контроллер, который определяет, какой контроллер представления отображать, и это будет место для доступа и передачи словаря

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...