尝试访问 TabBar 时 IOS swift 致命错误 nil 异常

Posted

技术标签:

【中文标题】尝试访问 TabBar 时 IOS swift 致命错误 nil 异常【英文标题】:IOS swift fatal error nil exception when trying to access TabBar 【发布时间】:2018-08-04 21:52:26 【问题描述】:

我有下面的 tabBar,每个 TabBar 都属于它自己的特定 UIViewController 。我的问题是我的 Home Tab Bar 。如果我在另一个 TabBar 项目(如“搜索”或“通知”)中,该 TabBar 有一个 TableView 并返回到我的 Home tab Bar 项目,那么我希望我的 TableView 保持在同一个地方。我已经能够通过调用它来做到这一点

   controller.dismiss(animated: false, completion: nil)

但是,正如您从下面的图像中看到的那样,我的 Home Tab Bar 项目没有突出显示,我创建了一个方法来尝试突出显示我的 Home Tab,但我得到一个 nil 异常。首先让我向您展示我的自定义功能,点击此处的所有选项卡栏项目

class HomeProfile: NSObject 
var mycontroller = ControllerEnum()


func TabBarLogic(_ tabBar: UITabBar, didSelect item: UITabBarItem, streamsModel: Int, controller: UIViewController) 

    if tabBar.items?.index(of: item) == 0 
          tabBar.tintColor = UIColor(hexString: "#004d99")

        if TabBarCounter == 0 
   // To Refresh 
            let nextViewController = controller.storyboard?.instantiateViewController(withIdentifier: "HomeC") as! HomeC
            controller.present(nextViewController, animated:false, completion: nil)
         else 
// keeps TableView position but does not highlight Tab           
            controller.dismiss(animated: false, completion: nil)
            let Home = HomeC()
            Home.HighlightTabBar() // Nil exception here
            TabBarCounter = 0
        

    
    if tabBar.items?.index(of: item)! == 1 
        // Search Tab Item
        tabBar.tintColor = UIColor(hexString: "#004d99")
        let nextViewController = controller.storyboard?.instantiateViewController(withIdentifier: "LocalSearchC") as! LocalSearchC
        controller.present(nextViewController, animated:false, completion:nil)
                      TabBarCounter = 1
    
    if tabBar.items?.index(of: item)! == 2 
      // Post
    
    if tabBar.items?.index(of: item)! == 3 
         // Notification
    
    if tabBar.items?.index(of: item)! == 4 
        // Menu
    


  

此功能类似于 facebook,如果您在主页上并再次单击主页选项卡,它将刷新 TableView 但是如果您在另一个选项卡上并返回主页选项卡,它将保持您的位置; TabBarCounter 会检查它。

好的,这是我的 Tab 的 Home Controller 代码

class HomeC: UIViewController,UITableViewDataSource,UITableViewDelegate, UITabBarDelegate

 @IBOutlet weak var TabBar: UITabBar!

 override func viewDidLoad() 
        super.viewDidLoad()
TabBar.delegate = self
      TabBar.selectedItem = TabBar.items![0]
       TabBar.tintColor = UIColor(hexString: "#004d99")


  func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 
        homeProfile.TabBarLogic(tabBar, didSelect: item, streamsModel: TabCounter,controller: self)



func HighlightTabBar() 
    TabBar.delegate = self 
    TabBar.selectedItem = TabBar.items![0] // this fails
    TabBar.tintColor = UIColor(hexString: "#004d99")

我知道它失败的原因是因为 HighlightTabBar() 中的 TabBar 在调用它时没有对 TabBar 的引用。我怎样才能使它起作用。我一直在看这个How to programmatically change UITabBar selected index after Dismiss?,但到目前为止没有任何效果。

【问题讨论】:

致命错误的主要原因在这一行let Home = HomeC()。您创建一个新的空HomeC,其中TabBar 为零。但我不明白你的代码的视图层次结构。你不使用UITabBarController 吗?如果有,为什么? 您需要确保在viewDidLoad 之后调用tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 【参考方案1】:

将代码放入 App 委托或按钮操作中

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let tabBarController = appDelegate.window?.rootViewController as! UITabBarController
tabBarController.selectedIndex = 2

【讨论】:

以上是关于尝试访问 TabBar 时 IOS swift 致命错误 nil 异常的主要内容,如果未能解决你的问题,请参考以下文章

无法在 View Controller iOS Swift 中显示 TabBar

屏幕顶部的Swift Placing TabBar无法在iOS 11中运行

iOS Swift tabBarItem 与 tabBar 边框相交

Swift 防止 TabBar 在键盘处于活动状态时向上移动

swift 适用于iOS的标题TabBar

在 Swift 4 中的 TabBar 下绘制关闭过渡