2015-04-24 4 views
0

Сценарий выглядит следующим образом:Получение информации от контроллера View до AppDelegate

У меня есть контроллер просмотра, который анализирует входные звуки. Как только звук распознается, я устанавливаю локальное уведомление так.

var notification: UILocalNotification = UILocalNotification() 
notification.fireDate = NSDate(timeIntervalSinceNow: 0.0) 
notification.alertTitle = knn as String 
UIApplication.sharedApplication().scheduleLocalNotification(notification) 

Это вызывает application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) функцию в AppDelegate.

Теперь я также хочу сохранить некоторые данные в базе данных в зависимости от того, что пользователь выбрал в уведомлении. Мои AppDelegate-х didReceiveLocalNotification:

var state: UIApplicationState = application.applicationState 
if state == .Active { 
    var alert = UIAlertController(title: "Alert", message: notification.alertTitle, preferredStyle: .Alert) 
    var correct = UIAlertAction(title: "Correct", style: .Default, handler: { (test) -> Void in 
     //create a new sound in context 
     var newSound = Sound.createInManagedObjectContext(self.managedObjectContext!, title: notification.alertTitle, zcr: vc.zcrArray, spectralCentroid: vc.scArray, spectralFlatness: vc.sfArray, mfcc: vc.mfccArray, spectralSlope: vc.ssArray) 
     var error : NSError? 
     self.managedObjectContext!.save(&error) 
    }) 
    var wrong = UIAlertAction(title: "Incorrect", style: .Default, handler: nil) 
    alert.addAction(wrong) 
    alert.addAction(correct) 
    var view = self.window?.rootViewController 
    view?.presentViewController(alert, animated: true, completion: nil) 
} 

Для того, чтобы сохранить значения в базу данных, мне нужно, чтобы захватить их от контроллера представления. Но я не могу найти способ их получить. Я попытался использовать self.window?.rootViewController, чтобы попытаться найти правильный контроллер, но безуспешно. Переменные, которые я пытаюсь сохранить, называются vc.zcrArray, vc.mfccArray и т. Д. В приведенном выше коде.

Моя раскадровка выглядит следующим образом: storyboard

Любые идеи, что я делаю неправильно?

ответ

1

В соответствии с вашим раскадровкой self.window? .rootViewController является контроллером tabbar. Вы должны получить представленный контроллер представлений контроллера tabbar, который является одним из навигационных контроллеров. А затем получите представленный контроллер представления контроллера навигации, который должен иметь контроллер просмотра, в котором вы проанализировали звук.

/*** EDIT

Поскольку вы используете раскадровку, попробуйте использовать этот кусок кода (имейте в виду, вы используете правильное имя для раскадровки и просмотра контроллера):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *uvc = [storyboard instantiateViewControllerWithIdentifier:@"Details"]; [self.window.rootViewController presentViewController:uvc animated:YES completion:nil];

EDIT ***/

Если значения, которые вы хотите сохранить, - property list types, вы можете использовать свойство userInfo местного уведомления для их отправки.

+0

Можете привести пример кода? Я попробовал все возможные комбинации, и я все равно получаю нуль. Я также думал о userInfo, но он принимает только один список, и мне нужно передать 4 ... – nevos

+1

Userinfo - это nsdictionary, который принимает массивы, поэтому вы можете установить свои данные следующим образом: 'ln.userInfo = @ {@" zcr " : vc.zcrArray, @ "mfcc": vc.mfccArray}; ' –

+0

Поскольку вы используете раскадровку, попробуйте использовать следующий фрагмент кода для получения viewcontroller (имейте в виду, что вы используете правильное имя для раскадровки и просмотра контроллер): 'UIStoryboard * раскадровка = [UIStoryboard раскадровкаWithName: @" Main "bundle: nil]; UIViewController * uvc = [storyboard instantiateViewControllerWithIdentifier: @ "Details"]; [self.window.rootViewController presentViewController: uvc animated: YES завершение: nil]; ' –

Смежные вопросы