jjzjj

ios - UITabBarController,不时消失最后一项

coder 2024-01-28 原文

我像往常一样有我的自定义 TabBarController,它包含 8 个 viewController

class STTabBarController: UITabBarController,UITabBarControllerDelegate {

let tabBarOrderKey = "tabBarOrderKey"
private var messangerNavigationController: UINavigationController!

override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
    configureViewControllers()
    setUpTabBarItemTags()
    getSavedTabBarItemsOrder()
}

func configureViewControllers() { 
    let clientsController = STClientsViewController(nibName: "STClientsViewController", bundle: nil)
    let clientNavigationController = UINavigationController(rootViewController: clientsController)
    clientsController.title = "Clients"
    clientNavigationController.tabBarItem.image = UIImage(named: "Client")

    let openHouseController = STOpenHouseViewController(nibName: "STOpenHouseViewController", bundle: nil)
    let openHouseNavigationController = UINavigationController(rootViewController: openHouseController)
    openHouseController.title = "Open House"
    openHouseNavigationController.tabBarItem.image = UIImage(named: "OpenHouse")

    let performanceController = STChartsViewController(nibName: "STChartsViewController", bundle: nil)
    let performanceNavigationController = UINavigationController(rootViewController: performanceController)
    performanceController.title = "Performance"
    performanceNavigationController.tabBarItem.image = UIImage(named: "Performance")

    let calculatorsController =  STCalculatorsViewController(nibName: "STCalculatorsViewController", bundle: nil)
    let calculatorsNavigationController = UINavigationController(rootViewController: calculatorsController)
    calculatorsController.title = "Calculators"
    calculatorsNavigationController.tabBarItem.image = UIImage(named: "Calculators")
    let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let communityViewController = storyBoard.instantiateViewController(withIdentifier: "Navigation")
    communityViewController.title = "Community"
    communityViewController.tabBarItem.image = UIImage (named:"Community")
    let industryProfessionalsController = STIndustryProfessionalsViewController(nibName: "STIndustryProfessionalsViewController", bundle: nil)
    let industryProfessionalsNavigationController = UINavigationController(rootViewController: industryProfessionalsController)
    industryProfessionalsController.title = "Vendors"
    industryProfessionalsNavigationController.title = "Vendors"
    industryProfessionalsNavigationController.tabBarItem.image = UIImage(named: "Industry-professionals")

    let agentResourcesController = STAgentResourcesViewController(nibName: "STAgentResourcesViewController", bundle: nil)
    let agentResourcesNavigationController = UINavigationController(rootViewController: agentResourcesController)
     agentResourcesController.title = "Resources"
    agentResourcesNavigationController.title = "Resources"
    agentResourcesNavigationController.tabBarItem.image = UIImage(named: "Agent-Resources")


    let settingsController = STSettingsViewController(nibName: "STSettingsViewController", bundle: nil)
    let settingsNavigationController = UINavigationController(rootViewController: settingsController)
    settingsController.title = "Settings"
    settingsNavigationController.tabBarItem.image = UIImage(named: "Settings")

    let coachController = STCoachsCornerViewController(nibName: "STCoachsCornerViewController", bundle: nil)
    let coachNavigationController = UINavigationController(rootViewController: coachController)
    coachController.navigationItem.title = "Action Plan"
    coachNavigationController.tabBarItem.title = "Plan"
    coachNavigationController.tabBarItem.image = UIImage(named: "Plan")

    self.viewControllers = [clientNavigationController ,performanceNavigationController,calculatorsNavigationController, coachNavigationController,industryProfessionalsNavigationController,agentResourcesNavigationController,openHouseNavigationController, settingsNavigationController]

    tabBar.isTranslucent = false
    let topBorder = CALayer()
    topBorder.frame = CGRect(x: 0, y: 0, width: 1000, height: 0.5)
    topBorder.backgroundColor = UIColor.returnRGBColor(r: 229, g: 231, b: 235, alpha: 1).cgColor
    tabBar.layer.addSublayer(topBorder)
    tabBar.clipsToBounds = true
}

func setUpTabBarItemTags() {
    var tag = 0
    if let viewControllers = viewControllers {
        for view in viewControllers {
            view.tabBarItem.tag = tag
            tag += 1
        }
    }
}

func getSavedTabBarItemsOrder() {
    var newViewControllerOrder = [UIViewController]()
    if let initialViewControllers = viewControllers {
        if let tabBarOrder = UserDefaults.standard.object(forKey: tabBarOrderKey) as? [Int] {
            for tag in tabBarOrder {
                newViewControllerOrder.append(initialViewControllers[tag])
            }
            setViewControllers(newViewControllerOrder, animated: false)
        }
    }
}

func tabBarController(_ tabBarController: UITabBarController, didEndCustomizing viewControllers: [UIViewController], changed: Bool) {
    var orderedTagItems = [Int]()
    if changed {
        for viewController in viewControllers {
            let tag = viewController.tabBarItem.tag
            orderedTagItems.append(tag)

        }

        UserDefaults.standard.set(orderedTagItems, forKey: tabBarOrderKey)
    }
}

当我在不同的设备上启动时,我遇到了这个问题,它有时会隐藏“更多”选项卡中的设置(最后一个)项目。这看起来有点荒谬,因为代码如您所见简单明了,但我不知道这里可能出什么问题。 smb 知道它会是什么吗?谢谢

最佳答案

问题在于将此选项卡的顺序保存到用户默认值。 我有 7 个 Controller ,但在尝试保存时,只保存了 6 个。 下面是保存函数的最终代码:

func getSavedTabBarItemsOrder() {
    var newViewControllerOrder = [UIViewController]()
    if let initialViewControllers = viewControllers {
        if let tabBarOrder = UserDefaults.standard.object(forKey: tabBarOrderKey) as? [Int] {
            for tag in tabBarOrder {
                newViewControllerOrder.append(initialViewControllers[tag])
            }
            let difference = Set(initialViewControllers).subtracting(newViewControllerOrder)
            newViewControllerOrder.append(contentsOf: difference)
            setViewControllers(newViewControllerOrder, animated: false)
        }
    }
}

关于ios - UITabBarController,不时消失最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51113315/

有关ios - UITabBarController,不时消失最后一项的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  5. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  6. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby - 有什么方法可以告诉 sidekiq 一项工作依赖于另一项工作 - 2

    有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz

  9. Ruby - 删除文件中的最后一个字符? - 2

    看起来一定很简单,但我就是想不通。如何使用RubyIO删除文件的最后一个字符?我查看了deletingthelastlineofafile的答案使用Ruby但没有完全理解它,必须有更简单的方法。有什么帮助吗? 最佳答案 有File.truncate:truncate(file_name,integer)→0Truncatesthefilefile_nametobeatmostintegerbyteslong.Notavailableonallplatforms.所以你可以这样说:File.truncate(file_name,Fil

  10. ruby-on-rails - Ruby on Rails 的最后 20% - 2

    我是(相当)一位经验丰富的程序员,但对Ruby和RubyonRails完全陌生。RoR看起来很适合快速工作,特别是用于CRUD操作的自动屏幕生成。它确实能让您快速提高工作效率。问题是最后20%的工作,那时我必须完成我的申请。RoR公约不会妨碍我吗?因为不是每个数据库表都必须对所有用户可用,也不是所有用户都可以编辑所有列和/或所有行,而且View必须适应我网站的外观等。我知道RoR已成功用于现场,但在第一阶段烧毁后,如何在RoR中获得足够的速度以逃避重力。 最佳答案 我认为脚手架无法让您达到80%。脚手架很好,因为它向您展示了Rail

随机推荐