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

3

我正在尝试使我的导航栏透明。当我在同一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()
    }
}

确保 self.navigationController != nil - Mahendra
@MahendraGP,你看到这个问题了吗? - Ashley Mills
@AshleyMills,那只是一个建议。他还说在其他视图控制器中不起作用,所以... - Mahendra
3个回答

3

既然您决定编写导航控制器的扩展,那么您必须从它的角度出发来编写:

import UIKit

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

3

您不需要在 navigationController 上使用 ?

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

1
这是因为您的视图控制器尚未放置在导航栈中。如果您的视图控制器没有放置在导航栈中,则self.navigationController将返回nil。
尝试将makeNavigationBarTransparent()调用移动到viewWillAppear方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接