Swift 如何从 UIViewController 的扩展调用函数

How to call a function from an extension to UIViewController in Swift

我正在努力使我的 Navigation bar 透明化。当我在同一个 ViewController 中创建函数时它起作用,但是我想在许多其他 ViewControllers 中重用它,所以我决定使用 extension 扩展 UINavigationController。当我尝试将函数调用到 ViewDidLoad 时,它不起作用。

import UIKit

class StudentsViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.makeNavigationBarTransparent()   
    } 
}

这是我的分机

import UIKit

extension UINavigationController {
    func makeNavigationBarTransparent() {
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
    }
}

既然决定要写navigation controller的扩展,就必须从它的角度来写:

import UIKit

extension UINavigationController {
    func makeNavigationBarTransparent() {
        self.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationBar.shadowImage = UIImage()
    }
}

您不需要 navigationController?.

extension UINavigationController {
    func makeNavigationBarTransparent() {
        navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationBar.shadowImage = UIImage()
    }
}

这是因为您的 viewController 尚未放置在您的导航堆栈中。如果您的 vc 未放置在导航堆栈中,则 self.navigationController 将 returns nil

尝试将您的 makeNavigationBarTransparent() 调用移动到 viewWillAppear 方法。