AppDelegate: получить значение из ViewController? - PullRequest
1 голос
/ 15 февраля 2010

Я хотел бы получить на

- (void)applicationWillTerminate:(UIApplication *)application

переменная из класса контроллера представления. Я создал приложение с вкладками и только добавил контроллер вкладок к приложению.

[window addSubview:tabBarController.view];

Как я могу получить переменную из TestViewController:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface TestViewController : UIViewController {
    IBOutlet UILabel *testLabel;
    NSString *currentString; //Value that i want to save at applicationWillTerminate
}

@property (nonatomic, retain) UILabel* testLabel;
@property (nonatomic, retain) NSString* currentString;

@end

Ответы [ 3 ]

2 голосов
/ 15 февраля 2010

Довольно случайно, что TestViewController не был освобожден к моменту достижения applicationWillTerminate - возможно, имеет смысл сохранить это значение на уровне выше в вашем приложении. Такой подход заключается в том, чтобы всегда хранить currentString в UIApplicationDelegate, чтобы вам не приходилось извлекать его позже:

@implementation TestViewController
- (void)setCurrentString:(NSString *)currentString {
    ((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).currentString = currentString;
} 
@end
1 голос
/ 15 февраля 2010

Расширяя ответ dbarker, похоже, что вам действительно нужно сохранить значение currentString в вашей модели данных. Правильное место для этого находится в самом viewController.

Если ваша модель данных - это всего лишь одна строка, вы можете создать свойство в делегате приложения для его хранения. Затем viewController записывает в свойство делегата приложения всякий раз, когда значение currentString изменяется в представлении и / или его значение при закрытии представления.

Таким образом, данные (которые, в любом случае, составляют всю точку приложения) всегда остаются на месте, когда приложение закрывается, независимо от того, сколько просмотров вы открываете.

Контроллеры должны переносить информацию из интерфейса в модель данных. Строго говоря, viewController не должен хранить никаких данных, кроме тех, которые необходимы для самого интерфейса. Это должно быть свойство модели данных, которое viewControllers устанавливает путем отправки сообщения объекту модели данных со значениями, взятыми из интерфейса.

В этом случае у вас не будет свойства currentString в ваших контроллерах представления. Вместо этого они будут иметь свойство, которое является просто ссылкой на свойство currentString модели данных. Контроллеры представления будут постоянно обновлять это свойство, но сами ничего не будут хранить.

Преимущество этой конструкции очевидно. Если вам нужно значение в любом месте вашего приложения, у вас есть одно местоположение и один вызов, чтобы получить его. Ни одной части приложения не нужно даже знать о существовании какой-либо другой части приложения, кроме модели данных.

0 голосов
/ 15 февраля 2010

Не уверен на 100%, что вы просите, но вот предположение:
UITabBarController имеет свойство viewControllers, которое возвращает все контроллеры представления, связанные с панелью вкладок.

Предполагая, что TestViewController был первой вкладкой, к которой вы могли получить доступ:

- (void)applicationWillTerminate:(UIApplication *)application {
    TestViewController* test_view_controller = [tabBarController.viewControllers objectAtIndex:0] ;
    NSString* value = test_view_controller.currentString ;
}

Обратите внимание, что это сломалось бы, если бы вы позже решили переместить TestViewController в другую позицию на панели вкладок.

- Правка - Проверьте все контроллеры и получите строку из контроллера типа TestViewController.

NSString* value = nil ;
for ( id unknownController in tabBarController.viewControllers ) {
  if ( [unknownController isKindOfClass:[TestViewController class]] ) {
     value = ((TestViewController*)unknownController).currentString ; 
  }
}
// value should be the value of the string.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...