Swift 4では、使用したい 拡張 の UIBarButtonItem
特別なインスタンス化 UIBarButtonItem
オブジェクト。
ここに私のコードがあります(必須ステートメントのみ):
import Foundation
extension UIBarButtonItem {
convenience init(staticImageName: String) {
let staticView = UIImageView.init(image: UIImage(named: staticImageName))
self.init(customView: staticView)
// further code…
}
override open var isEnabled: Bool {
didSet {
print("didSet called") // Should be replaced by other code…
}
}
} // extension UIBarButtonItem
この拡張機能は問題なくビルドされます。
ただし、アプリを実行すると、ステートメントでランタイムエラーが発生します
self.init(customView: staticView)
.
ログには次のように書かれています:
-[UIBarButtonItem isEnabled]: unrecognized selector sent to instance 0x7fe20c505180
私のコードで何が間違っていますか?
回答:
回答№1は0拡張機能を使用して既存の機能をオーバーライドすることは想定されていません。拡張機能は、新しい機能を追加するためにのみ使用されることになっています。
Swiftブックの拡張機能の章の場合:
「拡張機能は新しい機能を型に追加できますが、既存の機能を上書きすることはできません。」
したがって、適切な解決策はサブクラス化することです UIBarButtonItem
既存の機能をオーバーライドする場合。次に、必要な場所でサブクラスを使用します。