SwiftのUIButtonのサブクラスにdouble値を追加しようとしています。すべての種類の初期化を試し、オプションを取得および設定しましたが、動作しません。
だから私はこれで始めました
class CVSTButton : UIButton {
var cvstPosition: Double
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
super.init(coder: aDecoder)
}
}
次に試しました:
class CVSTButton : UIButton {
var cvstPosition: Double {
get {
return self.cvstPosition
}
set {
self.cvstPosition = newValue
}
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
super.init(coder: aDecoder)
}
}
私はここで何が間違っているのかわかりません...助けてください...
Swift 3、必要に応じて、次のコードスニペットのいずれかを選択して問題を解決できます。
UIButton
サブクラスをカスタム初期化子で作成しますこのソリューションにより、プロパティに適切な値を使用してUIButton
サブクラスのインスタンスを作成できます。このソリューションでは、UIButtonサブクラスのインスタンスをプログラムでのみ作成できます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int
required init(value: Int = 0) {
// set myValue before super.init is called
self.myValue = value
super.init(frame: .zero)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
_
使用法:
_import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(value: 0)
// let button = CustomButton() // also works
button.setTitle("Hello", for: .normal)
// auto layout
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue) // prints 0
}
}
_
UIButton
サブクラスを作成しますこのソリューションにより、プロパティに適切な値を使用してUIButton
サブクラスのインスタンスを作成できます。このソリューションでは、UIButton
サブクラスのインスタンスをプログラムでのみ作成できます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int
convenience init(squareOf value: Int) {
self.init(value: value * value)
}
required init(value: Int = 0) {
// set myValue before super.init is called
self.myValue = value
super.init(frame: .zero)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
_
使用法:
_import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(squareOf: 10)
// let button = CustomButton(value: 100) // also works
button.setTitle("Hello", for: .normal)
// auto layout
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue) // prints 100
}
}
_
init(frame: CGRect)
初期化子を使用してUIButton
サブクラスを作成しますこのソリューションでは、UIButton
サブクラスのインスタンスをプログラムでのみ作成できます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int
override init(frame: CGRect) {
// set myValue before super.init is called
self.myValue = 0
super.init(frame: frame)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
_
使用法:
_import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(frame: .zero)
//let button = CustomButton() // also works
button.setTitle("Hello", for: .normal)
// auto layout
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue) // prints 0
}
}
_
init?(coder aDecoder: NSCoder)
初期化子を使用してUIButton
サブクラスを作成しますこのソリューションを使用すると、StoryboardからUIButton
サブクラスのインスタンスを作成できます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int
required init?(coder aDecoder: NSCoder) {
// set myValue before super.init is called
self.myValue = 0
super.init(coder: aDecoder)
// set other operations after super.init, if required
backgroundColor = .red
}
}
_
使用法:
_import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: CustomButton!
override func viewDidLoad() {
super.viewDidLoad()
print(button.myValue) // prints 0
}
}
_
init(frame: CGRect)
およびinit?(coder aDecoder: NSCoder)
初期化子を使用してUIButton
サブクラスを作成しますこのソリューションを使用すると、UIButton
サブクラスのインスタンスをプログラムまたはStoryboardから作成できます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int
override init(frame: CGRect) {
// set myValue before super.init is called
self.myValue = 0
super.init(frame: frame)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
// set myValue before super.init is called
self.myValue = 0
super.init(coder: aDecoder)
// set other operations after super.init if required
backgroundColor = .red
}
}
_
UIButton
サブクラスを作成します以前のソリューションの代替として、初期化子の外部でプロパティに初期値を割り当てることができます。
_import UIKit
class CustomButton: UIButton {
var myValue: Int = 0
override init(frame: CGRect) {
super.init(frame: frame)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// set other operations after super.init if required
backgroundColor = .red
}
}
_
UIButton
サブクラスを作成しますボタンの作成時にプロパティにデフォルト値を設定したくない、または設定できない場合は、プロパティタイプをオプションとして設定する必要があります。
_import UIKit
class CustomButton: UIButton {
var myValue: Int? = nil
override init(frame: CGRect) {
super.init(frame: frame)
// set other operations after super.init, if required
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// set other operations after super.init if required
backgroundColor = .red
}
}
_
そこで必要な2つのこと-(1)cvstPosition
は、super.init()
を呼び出す前に、宣言またはinit
に初期値が必要です。 (2)fatalError
への呼び出しが設定されているため、イニシャライザーの実装を忘れないでください。これは基本的には意図的なクラッシュです。削除!
宣言に初期値を設定し、init
を必要としません:
class CVSTButton : UIButton {
var cvstPosition: Double = 0
}
または、初期化子で初期値を設定します。
class CVSTButton : UIButton {
var cvstPosition: Double
required init(coder aDecoder: NSCoder) {
cvstPosition = 0
super.init(coder: aDecoder)
}
}
UIButtonを継承するだけで、サブクラスのタイプは.Custom
defaultになります。
convenience init(type buttonType: UIButtonType) {
super.init(frame: CGRectZero)
// this button be automatically .Custom
}
override class func buttonWithType(buttonType: UIButtonType) -> AnyObject {
let button = super.buttonWithType(buttonType) as! UIButton
// your default code
return button
}
注:XCode 8.3.3でSwift 3)を使用しています
これは、カスタムプロパティとメソッドをUIButton
に追加する必要があるときに使用してきたシンプルで簡単な回避策です。
class CVSTButton: UIButton {
var cvstPosition: Double
static func button(withCVSTPosition cvstPosition: Double) -> CVSTButton {
let button = CVSTButton(type: .detailDisclosure) // You may adjust the initializer used to suit your needs.
button.cvstPosition = cvstPosition // Then you can simply set the the properties (which are passed as arguments to the factor/class method)
return button
}
}
使用するには:
let cvstButton = CVSTButton.button(withCVSTPosition: 2.0)