Ios 调整UINavigationController的协议

Ios 调整UINavigationController的协议,ios,swift,Ios,Swift,在我的每个视图控制器中,我都会调用一个函数来编辑导航控制器的外观和左/右按钮的文本。我不是在每个视图控制器中都有这段代码,而是尝试实现每个视图控制器都符合的协议 每个视图控制器中的当前代码: func setupNavReg(backButtonText: String, nextButtonText: String) { self.navigationController!.navigationBar.barTintColor = UIColor.whiteColor() se

在我的每个视图控制器中,我都会调用一个函数来编辑导航控制器的外观和左/右按钮的文本。我不是在每个视图控制器中都有这段代码,而是尝试实现每个视图控制器都符合的协议

每个视图控制器中的当前代码:

func setupNavReg(backButtonText: String, nextButtonText: String)
{
    self.navigationController!.navigationBar.barTintColor = UIColor.whiteColor()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)

    let leftNavButton = UIBarButtonItem(title: backButtonText, style: .Plain, target: self, action: Selector("backButtonPressed"))
    let customFont = UIFont(name: "Gill Sans", size: 14.0)

    leftNavButton.setTitleTextAttributes([NSFontAttributeName:customFont!], forState: UIControlState.Normal)
    self.navigationItem.leftBarButtonItem = leftNavButton

    //nextButton left out for     
}
协议设计

protocol navBarInterface {
    var navigationController: UINavigationController? { get }
    func configureWithBackButton(backButtonText: String, nextButtonText: String)
}

extension navBarInterface {
    func configureWithBackButton(backButtonText: String, nextButtonText: String) {

    if let navigationController = navigationController {
        navigationController.navigationBar.barTintColor = UIColor.whiteColor()
        navigationController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
        navigationController.navigationBar.shadowImage = UIImage()
        let customFont = UIFont(name: "Gill Sans", size: 14.0)

        let leftNavButton = UIBarButtonItem(title: backButtonText, style: .Plain, target: nil, action: Selector("backButtonPressed"))
        leftNavButton.tintColor = UIColor.whiteColor()
        leftNavButton.setTitleTextAttributes([NSFontAttributeName:customFont!], forState: UIControlState.Normal)
        navigationController.navigationItem.leftBarButtonItem = leftNavButton  

        //nextButton left out 
        }
    }
}

到目前为止,我还没法让它工作。导航控制器的外观没有改变,但我看到当视图控制器出现时,我设置的协议断点正在被击中。我还担心,当按下导航按钮时,我将无法点击选择器功能

如果此协议仅适用于
UINavigationController
,那么我会忘记该协议,只在
UINavigationController
上定义一个扩展:

extension UINavigationController {

    func configureWithBackButton(backButtonText: String, nextButtonText: String) {
        self.navigationBar.barTintColor = UIColor.whiteColor()
        self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
        self.navigationBar.shadowImage = UIImage()
        let customFont = UIFont(name: "Gill Sans", size: 14.0)

        let leftNavButton = UIBarButtonItem(title: "Back", style: .Plain, target: nil, action: Selector("backButtonPressed"))
        leftNavButton.tintColor = UIColor.whiteColor()
        leftNavButton.setTitleTextAttributes([NSFontAttributeName:customFont!], forState: UIControlState.Normal)
        self.navigationItem.leftBarButtonItem = leftNavButton  

        //nextButton left out 
    }
}
我只是说,因为协议有时与类和子类以令人生厌的方式进行交互——例如,如果您的类定义了方法,但协议也定义了方法,那么会发生什么,等等。因此,请尝试扩展类,看看这是否解决了问题


我还注意到您的代码是不同的-在原始方法中,
setupNavReg
,您将后退按钮的文本设置为
backbuttonext
,但在扩展中,您将其设置为
“后退”
。这是故意的吗?这可能就是为什么文本没有更改为您传递给方法的任何字符串…

尝试了这个方法,但我得到了相同的结果。你认为它应该叫什么名字。在
viewDidLoad
中,我编辑了我的答案以添加另一个建议。是的,我认为
viewDidLoad
是一个合适的名称。对此我深表歉意。那只是我草率的编辑。setUpNavReg是我的旧方法,已被注释掉。我正在为每个按钮标题传递一个字符串。