从 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
属性。同样在SocketIOManager
的init()
函数中,您应该调用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 栏项目的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS 中的 NSObject 类导航到 ViewController?
从 NSObject 类推送 iOS UIViewController
如何从 NSobject 类 iOS 在任何视图控制器类上弹出 MFMessageComposeViewController 对象