Пользовательский 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
: