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是我的旧方法,已被注释掉。我正在为每个按钮标题传递一个字符串。