【问题标题】:How do I find the visibleViewController in appdelegate?如何在 appdelegate 中找到 visibleViewController?
【发布时间】:2015-07-10 18:13:08
【问题描述】:

我目前像这样以编程方式实例化情节提要:

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)调用本地通知或 B)如果推送通知对应于可见视图,则更新视图。

使用各种其他与 SO 相关的问题,我尝试使用这些代码变体访问可见视图控制器:

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。这是处理推送通知的最佳方法吗?

【问题讨论】:

    标签: swift


    【解决方案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)
    }
    

    【讨论】:

    • 感谢您的回答!我要编辑我的帖子,但我很好奇的是应用程序何时处于前台。如何更新 UI/确定我在哪个视图上以正确更新 UI?
    • @Jay 你可以使用NSNotificationCenter更新你的用户界面
    • 你说得对,我没有做好我的研究。我应该问的问题是,访问将更新 UI 的信息的最佳方式是什么?在 didReceiveRemoteNotification 中,如何将 userInfo 传递给观察者?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2012-11-17
    相关资源
    最近更新 更多