Пользовательский UIButton выбрасывает несколько ошибок проектирования

Я имею дело с ошибкой XCode, которую я не понимаю, я искал решения уже несколько дней, и обновление Pods, перезапуск XCode или что-то еще, похоже, не решило проблему...

У меня есть собственный класс, который выходит из UIButton:

import Foundation
import UIKit

//@IBDesignable  <-- COMMENTED BUT SAME ERRORS ... 
class CustomCardButton: UIButton {

    var nibName = "CustomCardButton"

    @IBOutlet weak var btnImageView: UIImageView!
    @IBOutlet weak var btnLabel: UILabel!

    @IBInspectable var image: UIImage? {
        get {
            return btnImageView.image
        } set(image) {
            btnImageView.image = image
        }
    }

    @IBInspectable var label: String? {
        get {
            return btnLabel.text
        } set(label) {
            btnLabel.text = label
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {
        let view = loadViewFromNib()
        view.frame = self.bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        btnImageView.layer.cornerRadius = 60/2
        btnImageView.layer.borderColor = UIColor(red: 5/255,
                                                 green: 66/255, blue: 38/255, alpha: 1).CGColor
        btnImageView.layer.borderWidth = 2
        btnLabel.font = UIFont.boldSystemFontOfSize(14.0)
        btnImageView.userInteractionEnabled = true
        btnLabel.userInteractionEnabled = true
        view.userInteractionEnabled = true
        addSubview(view)
    }

    func loadViewFromNib() -> UIButton {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
        return view
    }   
}

Это хорошо скопированный код из SO: Swift, Custom UIButton не работает при нажатии

И мой файл xib выглядит так:

Я держал это простым пока, вчера я попробовал это с более сложным (Да, 2 метки и Woooh изображения, сложный для xcode ...), и у меня была та же самая ошибка..

Ошибки:

Предварительная компиляция:

После запуска приложения происходит сбой, и у меня есть это:

30 let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
Поток 1: EXC_BAD ACCESS (код = 2, адрес = 0x16fc5bfd0)

31 let view = loadViewFromNib()
Поток 1: EXC_BAD ACCESS (код = 2, адрес = 0x16fc5bfd0)

32 setup()
Поток 1: EXC_BAD ACCESS (код = 2, адрес = 0x16fc5bfd0)

И я получил эти ошибки с 31 по 2840 ...

Я видел, что это ошибка XCode, и мы ничего не можем с этим поделать, но мне действительно нужна кнопка Custom с 2 метками и ImageVIew ...

1 ответ

Решение

Тебе нужен твой UIView's класс просто UIView, а не ваш пользовательский класс напрямую, ваш пользовательский класс File's owner в этом случае.

Вы создаете экземпляр этого представления при загрузке, поэтому, если пользовательский класс будет вашим классом, он будет запускаться снова и снова...

Перо: сделать UIView с UIButton как вспомогательное представление (Если ваше представление будет неким UIView, то вы измените его класс на UIButton, ваш IBActions не будет работать, так что лучше работать с UIButton как суб вид)

введите описание изображения здесь

И ваш File's owner Ваш пользовательский класс: введите описание изображения здесь

Теперь вы можете нажать Ctrl IBOutlets тебе File's owner Просто нажмите Ctrl и перетащите File's owner на желаемый вид:

введите описание изображения здесь введите описание изображения здесь

Вы можете сделать то же самое с IBActions на кнопку

Ваш код немного изменится:

Пользовательский класс, как было сказано, UIView:

@IBDesignable class CustomCardButton: UIView

И loadViewFromNib метод, вернется UIView, и не UIButton:

func loadViewFromNib() -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: nibName, bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}

Вот и все, вы должны увидеть IBDesignable в вашем storyBoard:

введите описание изображения здесь

С IBInspectables:

введите описание изображения здесь

Другие вопросы по тегам