Как Вы передаете объекты между Контроллерами Представления в Objective C?

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

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

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

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

5
задан Galen 5 May 2010 в 03:46
поделиться

4 ответа

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

Итак, в вашем 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];
}
9
ответ дан 18 December 2019 в 14:43
поделиться

В Obj-C есть глобальные переменные, вы инстанцируете их в App Delegate.

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

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

.
1
ответ дан 18 December 2019 в 14:43
поделиться

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

NSMutableDictionary *gDictionary;

@implementation ...
@end
1
ответ дан 18 December 2019 в 14:43
поделиться

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

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

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

2
ответ дан 18 December 2019 в 14:43
поделиться