从NSObject类更新UITabBarController条项

时间:2016-04-14 05:38:18

标签: swift uitabbarcontroller

我让NSObject类侦听来自我服务器的特定事件。

当发生此特定事件时,我想从名为TabBarController的UITabBarController更新现有tabBar项的徽章值。

如何从NSObject类访问它?

以下是监听该事件的NSOBject类。

启动应用程序时启动函数connectedToSocketIo()。

打印(“事件正在工作”)显示在终端中,所以一切正常。

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

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")

            }
        } 
    }       
}

3 个答案:

答案 0 :(得分:0)

您应该尝试在UITabBarController课程中获得对SocketIOManager的引用。获得标签栏控制器后,您可以更改所需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)
    }

}

希望这有帮助!

答案 1 :(得分:0)

@Jessy Naus

I removed:

  • the socket connection from the app delegate,
  • the override init function inside the socketIOManager so the init(UITabBarController)

and added the socket.connect() (from socket.io library) function inside the init function linked to the tab bar controller as follow:

init(tabBarController: UITabBarController) {

    super.init()

    self.tabBarController = tabBarController

    socket.connect()

    self.listeningToSocketEvent()
}

I have replaced "self.connectedToSocketIo()" by "listeningToSocketEvent()" has the meaning of this function is more clear.

All together following your instructions mentioned above = Works perfectly. So I put your answer as the good one.

Really not easy concept. Will still need some time to assimilate it and apply it to other components of the UI.

Thanks a lot for your help on this!

答案 2 :(得分:0)

实际上,我发现了另一种避免触及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
    }