从 NSObject 类更新 UITabBarController 栏项目

Posted

技术标签:

【中文标题】从 NSObject 类更新 UITabBarController 栏项目【英文标题】:Update UITabBarController bar item from NSObject class 【发布时间】:2016-04-14 05:38:17 【问题描述】:

我有 NSObject 类从我的服务器监听特定事件。

当这个特定事件发生时,我想从名为 TabBarController 的 UITabBarController 更新现有 tabBar 项的标记值。

如何从 NSObject 类访问它?

下面是监听事件的 NSOBject 类。

connectedToSocketIo()函数在应用启动时启动。

print("Event is working") 显示在终端中,所以一切正常。

我现在唯一需要的是能够更新特定栏项的徽章。

import Foundation
import UIKit
import SwiftyJSON


class SocketIOManager: NSObject

    func connectedToSocketIo()

        socket.on("post-channel:App\\Events\\contact\\newContactRequest") (data, ack) -> Void in

            let json = JSON(data)

            if json[0]["id"].string! == self.defaults.stringForKey("user_id")! 

                print("event is working")
                // I want to change the tab bar item badge here

             else 

                print("no event")

            
         
           

【问题讨论】:

您是在 AppDelegate 中启动套接字吗? @ryantxr 是的。在:applicationDidBecomeActive 通过我的 socketManager 中的一个函数。 【参考方案1】:

您应该尝试在您的SocketIOManager 类中获取对UITabBarController 的引用。获得标签栏控制器的引用后,您可以更改所需 UITabBarItem 的标记值。

import Foundation
import UIKit
import SwiftyJSON

class SocketIOManager: NSObject 

    /*
        var tabBarController: UITabBarController!
    */

    // When the tabBarController gets set the connectedToSocketIO function gets automatically called.
    var tabBarController: UITabBarController! 
        didSet 
            connectedToSocketIO()
        
    

    init() 
        super.init()
    

    // Either call this function
    init(tabBarController: UITabBarController) 
        super.init()

        self.tabBarController = tabBarController
        connectedToSocketIO()
    

    // Or create a setter
    func setTabBarController(tabBarController: UITabBarController) 
        self.tabBarController = tabBarController
    


    func connectedToSocketIo() 

        socket.on("post-channel:App\\Events\\contact\\newContactRequest") (data, ack) -> Void in

            let json = JSON(data)

            if json[0]["id"].string! == self.defaults.stringForKey("user_id")! 

                print("event is working")

                // Set the desired tab bar item to a given value
                tabBarController!.tabBar.items![0].badgeValue = "1"

             else 

                print("no event")

            
         
    
       

编辑

class CustomTabBarController: UITabBarController 

    var socketIOManager: SocketIOManager!

    viewDidLoad() 
        super.viewDidLoad()
        socketIOManager = SocketIOManager(tabBarController: self)
    


希望这会有所帮助!

【讨论】:

我收到以下错误:在展开可选值时意外发现 nil。似乎 SocketIOManager 找不到我的 tabBarController... 只有在您的UITabBarController 已加载时,您才应该调用connectedToSocketIo()。我已经编辑了我的答案以反映这些变化。 我在 viewDidLoad 的自定义 tabBarController 中添加了 'SocketIOManager(tabBarController: self)'。我有一个警告,提到结果未使用。并且错误保持不变。 抱歉,忘记在CustomTabBarController 中添加socketIOManager 属性。同样在SocketIOManagerinit() 函数中,您应该调用super.init() 调整后socketIOManager不再监听。我什至没有得到 print("event is working") 了【参考方案2】:

@Jessy Naus

我删除了:

来自应用委托的套接字连接, socketIOManager 中的重写 init 函数,因此 init(UITabBarController)

并在链接到标签栏控制器的init函数中添加了socket.connect()(来自socket.io库)函数,如下所示:

init(tabBarController: UITabBarController) 

    super.init()

    self.tabBarController = tabBarController

    socket.connect()

    self.listeningToSocketEvent()

我已经将“self.connectedToSocketIo()”替换为“listeningToSocketEvent()”,这个函数的意思更清楚了。

按照上述说明进行操作 = 完美运行。所以我认为你的答案是好的。

真是不容易的概念。仍需要一些时间来吸收它并将其应用到 UI 的其他组件。

非常感谢您在这方面的帮助!

【讨论】:

【参考方案3】:

实际上,我找到了另一种避免接触我的 socket.io 实例的方法。

来源:

Swift 2: How to Load UITabBarController after Showing LoginViewController

我只是将我的标签栏控制器链接如下:

在我的 SocketIOManager 中

//"MainTabBarController" being the UITabBarController identifier I have set in the storyboard.
//TabBarController being my custom UITabBarController class. 
// receivedNotification() being a method defined in my custom TabBarController class

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)            

let tabBarController: TabBarController = mainStoryboard.instantiateViewControllerWithIdentifier("MainTabBarController") as! TabBarController

tabBarController.receivedNotification(1)

在我的 TabBarController 类中:

func receivedNotification(barItem: Int)

    if let actualValue = self.tabBar.items![barItem].badgeValue 

        let currentValue = Int(actualValue)

        self.tabBar.items![barItem].badgeValue = String(currentValue! + 1)

     else 

        self.tabBar.items![barItem].badgeValue = "1"

    

    // Reload tab bar item
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    appDelegate.window?.rootViewController = self

【讨论】:

以上是关于从 NSObject 类更新 UITabBarController 栏项目的主要内容,如果未能解决你的问题,请参考以下文章

如何调用从 NSObject 类添加视图

如何从 json 字典自动创建模型类(NSObject)?

如何从 iOS 中的 NSObject 类导航到 ViewController?

从 NSObject 类推送 iOS UIViewController

如何从 NSobject 类 iOS 在任何视图控制器类上弹出 MFMessageComposeViewController 对象

目标 c - 制作从同一个父类继承的 NSManagedObject 和常规 NSObject 类