首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按需重新加载UITabBarController

按需重新加载UITabBarController
EN

Stack Overflow用户
提问于 2019-08-27 19:27:53
回答 2查看 1.2K关注 0票数 8

我有以下两个项目的TabBarController。这是正确的表现。

setupItems()更改其值时,我将从另一个控制器调用something函数。

函数被正确调用,问题是navFirstController.tabBarItem.image没有被更新。

代码语言:javascript
运行
复制
class TabBarController: UITabBarController {

  override func viewDidLoad() {
    super.viewDidLoad()
    setupItems()
  }

  func setupItems() {
    let scale: CGFloat = 0.35
    let navFirstController = UINavigationController(rootViewController: FirstController())

    let navSecondController = UINavigationController(rootViewController: SecondController())
    navSecondController.tabBarItem.image = UIImage.scale(image: UIImage(named: "image2")!, by: scale)
    navSecondController.tabBarItem.imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -8, right: 0)

    if something == true {
      navFirstController.tabBarItem.image = UIImage.scale(image: UIImage(named: "image1")!, by: scale)
    } else {
      navFirstController.tabBarItem.image = UIImage.scale(image: UIImage(named: "image3")!, by: scale)
    }

    navFirstController.tabBarItem.imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -8, right: 0)

    viewControllers = [navSecondController, navFirstController]
  }

}

我试过:

1) viewControllers?.remove(at: 1)setupItems()的开头

2) navFirstController.removeFromParent()setupItems()的开头

3) self.viewWillLayoutSubviews()setupItems()的末尾

4) self.view.setNeedsLayout()self.view.setNeedsDisplay()setupItems()的末尾

EN

回答 2

Stack Overflow用户

发布于 2019-08-30 10:51:00

我不认为我们需要再次创建viewControllers对象,仅仅是为了更改选项卡条图像。我们只需要从viewController数组中获取viewControllers对象并更改图像。

代码语言:javascript
运行
复制
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnClicked(_ sender: Any) {
        //change image of tab bar item on button clicked
        if let tabVC = self.tabBarController as? TabBarController {
            tabVC.changeImage()
        }
    }

}


class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupItems()
    }

    func setupItems() {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let firstVC = storyboard.instantiateViewController(withIdentifier: "First")
        let navFirstController = UINavigationController(rootViewController: firstVC)
        navFirstController.tabBarItem.image = UIImage(named: "Image1")

        let secondVC = storyboard.instantiateViewController(withIdentifier: "Second")
        let navSecondController = UINavigationController(rootViewController: secondVC)
        navSecondController.tabBarItem.image = UIImage(named: "Image2")

        viewControllers = [navSecondController, navFirstController]
    }

    func changeImage() {
        if let second = viewControllers?[1] as? UINavigationController {
            second.tabBarItem.selectedImage = UIImage(named: "Image3")
            second.tabBarItem.image = UIImage(named: "Image3")
        }
    }

}

如果要更改选定的选项卡项图像,则更改“”值,否则更改"selectedImage“值。

票数 1
EN

Stack Overflow用户

发布于 2019-08-30 17:11:54

您可能需要将图像的呈现模式设置为UIImageRenderingModeAlwaysOriginal

试着改变这个:

代码语言:javascript
运行
复制
  navFirstController.tabBarItem.image = UIImage.scale(image: UIImage(named: "image1")!, by: scale)

在这方面:

代码语言:javascript
运行
复制
  navFirstController.tabBarItem.image = UIImage.scale(image: UIImage(named: "image1")!, by: scale).withRenderingMode(.alwaysOriginal)

编辑-示例代码

考虑一下这个设置:

  • 初始视图控制器是一个自定义类TabBarViewController。
  • 红色背景视图控制器是一个具有故事板ID "First“的UIViewController。
  • 橙色背景视图控制器是一个自定义类SecondViewController,具有IBAction和情节提要ID "Second“。

Assets.xcassets文件有三个映像(40x40PNG):

TabBarViewController

代码语言:javascript
运行
复制
import UIKit

class TabBarViewController: UITabBarController {

    var something: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        setupItems()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }

    func setupItems() {

        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        let firstVC = storyboard.instantiateViewController(withIdentifier: "First")
        let navFirstController = UINavigationController(rootViewController: firstVC)
        navFirstController.tabBarItem.image = UIImage(named: "image1")!.withRenderingMode(.alwaysOriginal)

        let secondVC = storyboard.instantiateViewController(withIdentifier: "Second")
        let navSecondController = UINavigationController(rootViewController: secondVC)

        navSecondController.tabBarItem.image = UIImage(named: "image2")!.withRenderingMode(.alwaysOriginal)
        navSecondController.tabBarItem.imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -8, right: 0)

        if something == true {
            navFirstController.tabBarItem.image = UIImage(named: "image3")!.withRenderingMode(.alwaysOriginal)
        } else {
            navFirstController.tabBarItem.image = UIImage(named: "image1")!.withRenderingMode(.alwaysOriginal)
        }

        navFirstController.tabBarItem.imageInsets = UIEdgeInsets(top: 8, left: 0, bottom: -8, right: 0)

        viewControllers = [navSecondController, navFirstController]
    }

}

SecondViewController

代码语言:javascript
运行
复制
import Foundation
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnClicked(_ sender: Any) {
        //change image of tab bar item on button clicked
        if let tabVC = self.tabBarController as? TabBarViewController {
            tabVC.something = !tabVC.something
            tabVC.setupItems()
        }
    }

}

输出

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57681102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档