我一直试图控制项目中所有按钮的外观。我创建了一个扩展并将其放在一个ViewController文件的顶部,以控制该视图中所有按钮的外观。它很棒。这是:
import UIKit
// EXTENSION TO CONTROL BUTTON APPEARANCE
extension UIButton {
func styleButton() {
self.layer.cornerRadius = 8
self.layer.borderWidth = 2
self.layer.borderColor = UIColor.red.cgColor
}
}
class DefaultSettingsVC: UIViewController, UITextFieldDelegate {
...
// IN VIEWDIDLOAD :
myButton1.styleButton()
myButton2.styleButton() //etc.
唯一的问题是我需要将它放在每个ViewController文件的顶部。 (我希望我在这里使用正确的术语。)所以不是那样,我想我会创建一个全新的文件,它是UIButton的子类。这是整个文件的内容:
import UIKit
class ButtonStyle: UIButton {
func styleButton() {
self.layer.cornerRadius = 8
self.layer.borderWidth = 2
self.layer.borderColor = UIColor.red.cgColor
}
}
但现在呢?!当我尝试将它添加到我的ViewController文件中的类行时,我得到了一个"来自类的多重继承"错误。
class DefaultSettingsVC: UIViewController, UITextFieldDelegate, ButtonStyle {
我在这里走错了路吗?我应该以完全不同的方式做这件事吗?任何帮助都会很棒。我的Swift专业知识只有2.5分(满分5分),所以我还在学习,如果可以,我会很感激。
答案 0 :(得分:2)
您不应该使用子类来执行此操作。扩展是要走的路!如果您希望能够在不同的类中使用扩展,则应尝试将其放在单独的文件中。由于您要扩展UIButton
类,因此您希望可以从任何地方访问它。
请参阅ViewController
课程:
class MyViewController: UIViewController {
var button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
button.styleButton(cornerRadius: 8, borderWidth: 2, borderColor: UIColor.red.cgColor)
}
}
您的扩展程序文件:
extension UIButton {
func styleButton(cornerRadius: CGFloat, borderWidth: CGFloat, borderColor: CGColor) {
self.layer.cornerRadius = cornerRadius
self.layer.borderWidth = borderWidth
self.layer.borderColor = borderColor
}
}
我稍微调整了一下,所以现在你可以设置你想要的参数,以防你以后需要以不同方式设置一些按钮。在我看来,它更具有可重用性,因此更有用。
答案 1 :(得分:0)
我建议通过以下方式为所有ViewControllers中的所有按钮应用所需的样式:
为应用程序中的所有ViewControllers创建自定义UIViewController
超类。
让超类处理其视图中所有按钮的所需样式的应用。
超类应该类似于:
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupButtonsStyle()
}
func setupButtonsStyle() {
for subview in view.allSubViews.filter({$0 is UIButton}) {
let button = subview as! UIButton
button.layer.cornerRadius = 8
button.layer.borderWidth = 2
button.layer.borderColor = UIColor.red.cgColor
}
}
}
extension UIView {
var allSubViews : [UIView] {
var array = [self.subviews].flatMap {$0}
array.forEach { array.append(contentsOf: $0.allSubViews) }
return array
}
}
请注意,声明allSubViews
的目的是在视图中获取所有视图及其子视图。
确保子类viewDidLoad()
方法包含super.viewDidLoad()
:
class ViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
这种方法可以节省为应用程序中的每个按钮调用样式方法的时间(您不必为每个按钮手动调用button.styleButton
),所有您需要做的就是让期望ViewController作为超类的子类。
希望这会有所帮助。