programing

UIButton 하위 클래스를 시작하려면 어떻게 해야 합니까?

closeapi 2023. 8. 19. 10:19
반응형

UIButton 하위 클래스를 시작하려면 어떻게 해야 합니까?

스위프트의 UIButton 하위 클래스에 이중 값을 추가하려고 했습니다.모든 방법을 동원해 옵션을 설정해 보았지만 제대로 작동하지 않았습니다.

그래서 저는 이렇게 시작했습니다.

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을 사용하면 필요에 따라 다음 7개의 코드 스니펫 중 하나를 선택하여 문제를 해결할 수 있습니다.


다음을 작성합니다.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
    }

}

다음을 작성합니다.UIButton와의 하위 클래스.init(frame: CGRect)이니셜라이저

이 솔루션을 사용하면 의 인스턴스만 생성할 수 있습니다.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
    }

}

다음을 작성합니다.UIButton와의 하위 클래스.init?(coder aDecoder: NSCoder)이니셜라이저

이 솔루션을 사용하면 의 인스턴스를 생성할 수 있습니다.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
    }

}

다음을 작성합니다.UIButton와의 하위 클래스.init(frame: CGRect)그리고.init?(coder aDecoder: NSCoder)이니셜라이저

이 솔루션을 사용하면 의 인스턴스를 생성할 수 있습니다.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) {
        // 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
    }

}

거기서 두 가지가 필요합니다. (1)cvstPosition선언 또는 에서 초기 값이 필요합니다.init전화하기 전에super.init()(2) 그 전화는fatalError이니셜라이저를 구현하는 것을 잊지 않도록 삽입됩니다. 기본적으로 의도적인 충돌입니다.삭제!

선언에 초기 값을 설정하면 다음이 필요하지 않습니다.init:

class CVSTButton : UIButton {
    var cvstPosition: Double = 0
}

또는 Initializer에서 초기 값 설정

class CVSTButton : UIButton {
    var cvstPosition: Double

    required init(coder aDecoder: NSCoder) {
        cvstPosition = 0

        super.init(coder: aDecoder)
    }
}

Swift >= 2.2:

이 버전 이후로 하위 분류는UIButton당신의 버튼을 가지도록 합니다..custom활자를

스위프트 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
}

참고: 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)

언급URL : https://stackoverflow.com/questions/27079681/how-can-i-init-a-uibutton-subclass

반응형