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
'programing' 카테고리의 다른 글
PowerShell Where-Object 문에 다중 및/또는 포함됨 (0) | 2023.08.19 |
---|---|
Listview 목록 업데이트 후 목록 끝으로 스크롤 (0) | 2023.08.19 |
jQuery를 사용하여 요소 ID가 특정 텍스트를 포함하는 페이지의 모든 요소 찾기 (0) | 2023.08.19 |
CSS 오버플로 - 텍스트 한 줄만 (0) | 2023.08.19 |
텍스트 영역의 문자 수 (0) | 2023.08.19 |