2010-02-15 2 views
1

Я хотел бы получить вAppDelegate: получить значение от ViewController?

- (void)applicationWillTerminate:(UIApplication *)application 

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

[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 

ответ

2

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

@implementation TestViewController 
- (void)setCurrentString:(NSString *)currentString { 
    ((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).currentString = currentString; 
} 
@end 
+0

Спасибо, что работает отлично, но значение currentString меняется каждую секунду. Это нормально или не так ли удобно устанавливать currentString каждую секунду в AppDelegate? – x2on

+2

это, вероятно, не идеально - не потому, что это UIApplicationDelegate, а потому, что отправка трех сообщений каждую секунду дорого (sharedApplication, delegate, setCurrentString). Если TestViewController может делать то, что ему нужно делать с текущей строкой, то вы можете зарегистрировать его для UIApplicationWillTerminateNotification. – dstnbrkr

+0

Хорошо, я переписал мой код, поэтому я могу зарегистрировать UIApplicationWillTerminateNotification и сделать там действия. Спасибо за этот намек! – x2on

0

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

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

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

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

- Редактировать - Проверить все контроллеры и получить строку от контроллера типа 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. 
+0

Вот что я wan't, но когда я пытаюсь кода я получаю ошибку folowing когда я закрыть приложение: *** - [UINavigationController currentString]: непризнанные селектор направлен например 0x4313b80 *** Нагрузочный приложение из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [UINavigationController currentString]: непризнанный селектор, отправленный в экземпляр 0x4313b80 ' – x2on

+0

, он может быть с другим индексом табуляции. Вы можете перебрать все их и проверить, есть ли тип TestViewController. NSString * значение; для каждого контроллера в табуляции if ([unknownController isKindOfClass: [TestViewController class]]) { value = ((TestViewController *) unknownController) .currentString; } – Eld

1

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

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

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

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

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

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