使用扩展为现有属性赋值

时间:2015-08-26 12:17:16

标签: swift

我希望所有UINavigationBar个对象在其[NSFontAttributeName: UIFont(name: "Soft Elegance", size: 18)!]属性中具有默认值titleTextAttributes

UIViewController中,我就是这样设置的:

override func viewDidLoad() {
  super.viewDidLoad()
  navigationController!.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "Soft Elegance", size: 18)!]
}

但是,我有几个UIViewControllers都需要这行代码。我知道extensions可以为整个班级提供行为,但我没有为我的案例做到这一点:

extension UINavigationBar {
  var titleTextAttributes: [NSObject: AnyObject]! {
    return [NSFontAttributeName: UIFont(name: "Soft Elegance", size: 18)!]
  }
}

有没有办法通过extensions完成此操作?

2 个答案:

答案 0 :(得分:2)

您想要UIAppearance

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Soft Elegance", size: 18)!]

这会影响应用中的所有UINavigationBars。

答案 1 :(得分:1)

根据Swift Programming Guide,Swift中的扩展程序可以:

  • 添加计算属性和计算类型属性
  • 定义实例方法和类型方法
  • 提供新的初始化程序
  • 定义下标
  • 定义并使用新的嵌套类型
  • 使现有类型符合协议

扩展程序用于扩展/添加新行为,您需要的是覆盖默认行为。您可以通过子类UINavigationBarUIViewController来实现此目的,

class BaseViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController!.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "Soft Elegance", size: 18)!]
    }
}

然后使用BaseViewController替换现有的UIViewController