从另一个视图控制器访问变量。迅速

Posted

技术标签:

【中文标题】从另一个视图控制器访问变量。迅速【英文标题】:Access a variable from another view controller. Swift 【发布时间】:2016-04-30 00:38:49 【问题描述】:

如果有人向我发送消息并且我在特定的视图控制器 (ConversationViewController) 中,我会尝试显示通知。现在,我可以显示通知,但是当我尝试访问 ConversationViewController 中的变量(otherProfileName)时,它是 nil。我猜这是因为该变量(otherProfileName)是从另一个视图控制器传递的。我确信该变量已成功传递。一切正常,可以显示通知并打印“hi”,但变量为零。有什么建议可以解决吗?

对话视图控制器

// passed from another view controller
var otherProfileName = String()

appDelegate

func application(application: UIApplication,  didReceiveRemoteNotification userInfo: [NSObject : AnyObject],  fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 
    if application.applicationState == UIApplicationState.Active 
        print(topViewController())
        if topViewController() is ConversationViewController 
            let myCustomViewController: ConversationViewController = ConversationViewController(nibName: nil, bundle: nil)
            print(myCustomViewController.otherProfileName)
            print("HI")
            HDNotificationView.showNotificationViewWithImage(nil, title: "HI", message: "HHIHI", isAutoHide: true)
        
    
    completionHandler(UIBackgroundFetchResult.NewData)


func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? 
    if let MMDrawers = base as? MMDrawerController 
        for MMDrawer in MMDrawers.childViewControllers 
            return topViewController(MMDrawer)
        
    
    if let nav = base as? UINavigationController 
        return topViewController(nav.visibleViewController)
    
    if let tab = base as? UITabBarController 
        if let selected = tab.selectedViewController 
            return topViewController(selected)
        
    
    if let presented = base?.presentedViewController 
        return topViewController(presented)
    
    return base

【问题讨论】:

【参考方案1】:

这段代码没有意义:

    if topViewController() is ConversationViewController 
        let myCustomViewController: ConversationViewController = ConversationViewController(nibName: nil, bundle: nil)

翻译:

“如果顶部视图控制器是 ConversationViewController,则创建一个新的 ConversationViewController 空实例,并询问该实例的 otherProfileName 值”

这就像在一组盒子中寻找蓝色盒子,因为您知道它包含一个苹果。当你找到一个蓝色盒子时,去建造一个新的空蓝色盒子,打开它,想知道为什么里面没有你的苹果。

【讨论】:

因为我想检查当前其他(otherProfileName)是否与给我发消息的人匹配。 类似于 if userInfo["(other)"] == otherProfileName then match;否则,不匹配 你完全错过了我回答的重点。如果顶视图控制器是ConversationViewController,您将创建一个全新的空ConversationViewController,其中没有任何值,并尝试从新创建的空视图控制器中提取值。跨度> 类比 #2:我把钱包留在了 Prius 的手套箱里。去街上看看。如果我找到一辆普锐斯,就去买一辆相同颜色的新普锐斯,然后想知道为什么新普锐斯的手套箱里没有我的钱包。这就是你正在做的事情。 哦。我明白你的意思了。让 myCustomViewController: ConversationViewController = ConversationViewController(nibName: nil, bundle: nil)。那是指原始的conversationViewController。我以为它指的是我目前正在使用的那个。感谢您的帮助。【参考方案2】:

您正在这里创建 ConversationViewController 的新实例

let myCustomViewController: ConversationViewController = ConversationViewController(nibName: nil, bundle: nil)

试试

      if let myCustomViewController = topViewController() as? ConversationViewController 
            print(myCustomViewController.otherProfileName)
            print("HI")
            HDNotificationView.showNotificationViewWithImage(nil, title: "HI", message: "HHIHI", isAutoHide: true)
        
     

【讨论】:

以上是关于从另一个视图控制器访问变量。迅速的主要内容,如果未能解决你的问题,请参考以下文章

IOS 从另一个视图访问一个视图

从另一个视图控制器访问常量

快速从另一个视图控制器修改一个变量

快速从另一个访问 Viewcontroller 的实例

View helper 可以在一个控制器中访问,但不能从另一个控制器访问

如何在没有任何推送序列的情况下快速从另一个视图控制器访问方法?