Доступ к данным-членам RootViewController в другом классе - PullRequest
4 голосов
/ 30 марта 2009

Я занимаюсь разработкой приложения для iPhone с использованием Objective-C. Я хочу получить доступ к члену данных, который имеет тип NSMutableArray класса RootViewController в другом классе. Я попытался сделать массив статическим. Но я хотел бы иметь нестатический массив. Как мне этого добиться?

Ответы [ 2 ]

8 голосов
/ 30 марта 2009

Вам нужно две вещи:

  1. ссылка на RootViewController
  2. средство получения вашей переменной из RootViewController.

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

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

В своем классе делегата приложения вы должны добавить свойство с именем rootViewController, которое предоставляет ваш объект RootViewController. Теперь вы можете писать такие вещи, как

RootViewController *theRootViewController = appDelegate.rootViewController;

Это удовлетворяет первому требованию. Теперь, чтобы получить доступ к объекту, принадлежащему контроллеру представления, вам нужно добавить свойство к RootViewController. Вы на самом деле не сказали, что это за объект или что он делает, поэтому давайте просто назовем его myMutableArray. Создайте свойство readonly с таким именем в RootViewController, и теперь вы сможете писать такие вещи:

NSMutableArray *myArray = theRootViewController.myMutableArray;

Это позволит вам делать то, что вы хотите.

Я должен предупредить вас: разоблачение NSMutableArray, как правило, не очень хорошая идея. Причина в том, что если вы измените содержимое этого массива, RootViewController не будет знать, что вы сделали это. Таким образом, если бы вы создавали, скажем, представление основной детали, ваш RootViewController не знал бы о добавлении нового объекта.

Было бы лучше, если бы вы написали методы, позволяющие RootViewController модифицировать массив внутри. Например, у вас может быть метод с именем addFooObject:, который управляет массивом. Тогда контроллер представления узнает, что вы с ним сделали. Для доступа вы можете очень легко вернуть неизменяемую, автоматически выпущенную копию изменяемого массива из вашего свойства.

5 голосов
/ 23 сентября 2011

Вы также можете получить доступ к корневому контроллеру представления, используя SharedApplication в одной строке кода:

[[[UIApplication sharedApplication] keyWindow] rootViewController]
...