web-dev-qa-db-ja.com

UIButtonサブクラスを初期化する方法は?

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)
   }
}

私はここで何が間違っているのかわかりません...助けてください...

61

Swift 3、必要に応じて、次のコードスニペットのいずれかを選択して問題を解決できます。


1. 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
    }

}
_

2.簡易イニシャライザを使用して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
    }

}
_

3. 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
    }

}
_

4. 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
    }

}
_

5. 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
    }

}
_

6.プロパティのデフォルトプロパティ値を使用して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
    }

}
_

7.オプションのタイプを持つプロパティで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
    }

}
_
204
Imanou Petit

そこで必要な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)
    }
}
12
Nate Cook

Swift> = 2.2:

UIButtonを継承するだけで、サブクラスのタイプは.Custom defaultになります。

スイフト2:

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
}
6
dimpiax

注: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)
3
focorner