2015-07-10 2 views
1

я в настоящее время экземпляр раскадровки программным образом:Как найти visibleViewController в appdelegate?

var iphone35StoryBoard:UIStoryboard = UIStoryboard(name: "iphone35", bundle: nil) 

var initialViewController:UIViewController = iphone35StoryBoard.instantiateInitialViewController() as! UIViewController 

self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

self.window?.rootViewController = initialViewController 

self.window?.makeKeyAndVisible() 

Это мой первый раз работает с уведомлениями толчка, так что я не уверен в качестве лучшей практики, но то, что я пытаюсь сделать это в didReceiveRemoteNotification и в то время как приложение находится в активном состоянии (переднем плане), я хотел бы иметь возможность определить, какой вид пользователь в данный момент использует, чтобы определить, должен ли я A) вызвать локальный notificaiton или B) обновить представление, если push-уведомление соответствует видимый вид.

Используя различные другие SO родственные вопросы, я попытался получить доступ к visibleviewcontroller, используя эти изменения кода:

let navigationController = application.windows[0].rootViewController as! UINavigationController 

1)

let visibleController: AnyObject? = navigationController.visibleViewController 

if visibleController is ProfileViewController { 
    println("this works") 
} 

и

2)

let viewControllers: [UIViewController] = navigationController.viewControllers as! [UIViewController] 

for vc in viewControllers { 
    if vc is ProfileViewController { 
     println("this works") 
    } 
} 

3)

if let wd = self.window { 
    var vc = wd.rootViewController 
    if(vc is UINavigationController){ 
     vc = (vc as UINavigationController).visibleViewController 
    } 

    if(vc is ProfileViewController){ 
     println("this works") 
    } 
} 

проблемы я бег в том, что я могу только получить RootViewController и никогда не видимый контроллер представления. В этом случае rootviewcontroller - это экран входа в систему, и, несмотря на то, что я нахожусь в profileViewController, я могу получить только loginviewcontroller. Является ли это лучшим методом для обработки push-уведомлений?

ответ

1

Переход к целевой контроллер представления из раскадровки, когда толчок уведомление будет пришел

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil) 
    var destViewController : destVC 
    destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("destVC") as! destVC 
    var navigationController = UIApplication.sharedApplication().keyWindow!.rootViewController as! UINavigationController 
    navigationController.pushViewController(destViewController, animated: true) 

Это работает для меня с AppDelegate.

Используйте центр уведомлений для больше материала:

NSNotificationCenter.defaultCenter().postNotificationName("name", object: nil, userInfo:nil) 

NSNotificationCenter.defaultCenter().addObserver(self, selector: "method:", name: "name", object: nil) 

func method(notification: NSNotification) { 
    //Do your stuff. 
} 

Передача данных с уведомлением центра

NSNotificationCenter.defaultCenter().postNotificationName("name", object:nil, userInfo:["message":"Unable to add \(homeName) Home"]) 

func method(notification: NSNotification) { 
    //Do your stuff. 
    println(notification.userInfo) 
} 
+0

спасибо за ответы! Я собираюсь отредактировать свой пост, но мне было любопытно, когда приложение находится на переднем плане. Как обновить пользовательский интерфейс/определить, какой вид я просматриваю, чтобы правильно обновить интерфейс? – Jay

+1

@Jay Вы можете обновить свой пользовательский интерфейс с помощью 'NSNotificationCenter' –

+0

Вы правы, я не проводил исследования правильно. Вопрос, который я должен был задать, - это лучший способ получить доступ к информации, которая будет обновлять пользовательский интерфейс? В didReceiveRemoteNotification, как передать userInfo наблюдателю? – Jay

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