Подтвердить что ты не робот

Как запустить подкласс UIButton?

Я пытаюсь добавить двойное значение в подкласс UIButton в Swift Пробовал всевозможные inits и получить и установить параметры, но я не могу заставить его работать.

поэтому я начал с этого

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

Я не понимаю, что здесь не так... пожалуйста, помогите...

4b9b3361

Ответ 1

С 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. Создайте подкласс 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
    }

}

4. Создайте подкласс 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
    }

}

5. Создайте подкласс 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
    }

}

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
    }

}

Ответ 2

Две вещи, которые вам нужны, - (1) cvstPosition требуется начальное значение, либо в объявлении, либо в init, прежде чем вы вызовете super.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)
    }
}

Ответ 3

Swift:

override class func buttonWithType(buttonType: UIButtonType) -> AnyObject {
    let button = super.buttonWithType(buttonType) as! UIButton
    // your default code
    return button
}

Swift 2:

convenience init(type buttonType: UIButtonType) {
    super.init(frame: CGRectZero)

    // this button be automatically .Custom
}

Swift 2.2:

Просто наследуйте от UIButton, и ваш подкласс становится с типом .Custom по умолчанию.

Ответ 4

ПРИМЕЧАНИЕ. Я использую Swift 3 в XCode 8.3.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)