Как вызвать метод ViewController.m из AppDelegate.m

В моем ViewController.m у меня есть пустое «Сохранить данные»:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize myDatePicker, myTextField;

-(void)saveData
{
NSArray *value = [[NSArray alloc] initWithObjects:[myTextField text],[myDatePicker date], nil];
[value writeToFile:[self getFilePath] atomically:YES];

}

И я хочу использовать свой недействительный «Сохранить данные» в моем AppDelegate.m:

- (void)applicationDidEnterBackground:(UIApplication *)application
{

[self.ViewController saveData];

}

Но Xcode не распознает «ViewController» и «saveData».

Я не знаю, нужно ли #import что-то в моем AppDelegate, пожалуйста, помогите.


person JuanM.    schedule 25.01.2014    source источник
comment
Текущий ответ правильный - пусть ваш контроллер представления наблюдает за уведомлением, которое вы хотите обработать. Но ваш звонок нестандартен. У вас есть свойство для ссылки на контроллер представления, метод которого вы пытаетесь вызвать. ошибки компилятора говорят вам, что они были неправильно настроены.   -  person Abizern    schedule 25.01.2014


Ответы (2)


То, как вы получаете доступ к своему контроллеру представления из делегата приложения, будет зависеть от того, сколько у вас контроллеров представления/где он находится в вашей текущей навигационной иерархии и т. д. и т. д. Вы можете добавить для него свойство или, возможно, это будет делегат вашего приложения rootViewController.

Однако вам, вероятно, лучше слушать уведомление в вашем контроллере представления, когда приложение переходит в фоновый режим. Это означает, что необходимая вам логика может быть полностью автономна в вашем контроллере представления, и вашему делегату приложения не нужно ничего о ней знать.

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

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];

Затем реализуйте метод:

- (void)applicationDidEnterBackground:(NSNotification *)notification
{
    [self saveData];
}

И убедитесь, что вы также удалили себя в качестве наблюдателя в методе dealloc вашего контроллера представления:

-(void)dealloc 
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
}
person James Frost    schedule 25.01.2014
comment
Я сделал, как вы сказали, но у меня возникла проблема, когда я закрываю приложение, как только я хочу открыть его снова, оно вылетает и не открывается. Я не знаю, что там происходит. (( Должен ли быть * после NSNotification в пустоте, верно?)) - person JuanM.; 25.01.2014
comment
Да, должен быть *, обновил мой ответ. Какое сообщение об ошибке вы получаете при сбое? На какой строке он прерывается? - person James Frost; 25.01.2014
comment
Нет сообщения об ошибке. После того, как я установил приложение в iOS Simulator под управлением iOS 7, с закрытым xCode и перезапуском Simulator, оно работает в первый раз, но когда я закрываю и снова открываю приложение, ожидающее увидеть, что я сохранил, приложение просто не работает. открытым. Только то.. - person JuanM.; 28.01.2014

В вашем файле реализации "appDelegate.m" вверху выполните этот импорт ->

#import "ViewController.h"

Это сделает пользовательский класс ViewController видимым для appDelegate.

Чтобы иметь возможность вызывать метод -(void)saveData из другого класса (в нашем случае другим классом является класс AppDelegate), этот метод необходимо объявить в публичном интерфейсе. Это означает ->

#import "ViewController.h"


@interface ViewController ()

-(void)saveData;

@end
person Earl Grey    schedule 25.01.2014
comment
Я сделал #import, как вы сказали, но я все еще не могу добавить [self.viewController saveData] в свой AppDelegate.m, потому что Xcode не распознает ни viewController, ни saveData снова. - person JuanM.; 25.01.2014
comment
self.ViewController подразумевает, что вы создали свойство в appDelegate с именем ViewController. Первая проблема в том, что он начинается с UpperCase. Пожалуйста, переименуйте его в viewController. Другое дело, действительно ли у вас есть правильный экземпляр этого viewController? Возможно, это свойство не инициализировано. Вы понимаете концепцию экземпляров? Мне нужно спросить, даже если это может показаться глупым (извините :)), иначе я не уверен, насколько глубоко вы понимаете. - person Earl Grey; 25.01.2014
comment
Но надлежащий экземпляр звучит для меня в новинку. Вы могли бы помочь мне в этом. - person JuanM.; 25.01.2014
comment
То, что вы опубликовали, - это интерфейс класса ViewController. Мне нужно увидеть интерфейс AppDelegate.h. - person Earl Grey; 25.01.2014