Ios 如何在Swift中从扩展调用函数到UIViewController

Ios 如何在Swift中从扩展调用函数到UIViewController,ios,swift,uinavigationcontroller,uinavigationbar,ios-extensions,Ios,Swift,Uinavigationcontroller,Uinavigationbar,Ios Extensions,我正在尝试使我的导航栏透明。当我在同一个ViewController中创建函数时,它可以工作,但是我想在许多其他ViewController中重用它,因此我决定使用扩展UINavigationController。当我尝试将函数调用到ViewDidLoad中时,它不起作用 import UIKit class StudentsViewController: UIViewController { override func viewDidLoad() { super.v

我正在尝试使我的
导航栏
透明。当我在同一个
ViewController
中创建函数时,它可以工作,但是我想在许多其他
ViewController
中重用它,因此我决定使用
扩展
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()
    }
}

由于您决定为导航控制器编写扩展,因此必须从其预期角度编写扩展:

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将返回nil


尝试移动makeNavigationBarTransparent()调用视图将出现方法。

确保
self.navigationController!=无
@MahendraGP你读过这个问题吗?@AshleyMills,这只是一个建议。他还说,在其他视图中,控制器不工作,所以。。。