自定义 UIButton 抛出多个设计错误
Custom UIButton throw multiple design errors
我正在处理一个我不明白的 XCode 错误,几天来我一直在寻找解决方案,Pods 更新,XCode 重启或其他任何事情似乎都无法解决问题......
我有一个从 UIButton 扩展而来的自定义 class:
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 复制粘贴的代码:
我的 xib 文件如下所示:
我现在保持简单,昨天我尝试了一个更复杂的(是的,2 个标签和一个 imageview Woooh,复杂 xcode ...),我有同样的错误..
错误是:
预编译:
应用程序启动后它崩溃了,我遇到了这个:
30 let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
31 let view = loadViewFromNib()
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
32 setup()
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
我得到了从 31 到 2840 的那些错误...
我看到这是一个 XCode 错误,对此我们无能为力,但我确实需要一个带有 2 个标签和一个 ImageVIew 的自定义按钮 ...
您需要 UIView's
class 只是 UIView
,而不是您的自定义 class,您的自定义 class 是 File's owner
在这种情况下。
您在加载时实例化此视图,因此如果自定义 class 将成为您的 class,它将一遍又一遍地 运行...
笔尖:
使用 UIButton
创建一个 UIView
作为子视图(如果您的视图是某个 UIView,您将其 class 更改为 UIButton
,您的 IBActions
将无法工作,所以最好使用 UIButton
作为子视图)
而您的 File's owner
是您的习惯 class:
现在您可以按住 IBOutlets
并拖动到 File's owner
,只需按住 File's owner
拖动到所需的视图即可:
您可以对按钮 IBActions
执行相同的操作
您的代码会稍微改变一下:
习俗class如前所述是UIView
:
@IBDesignable class CustomCardButton: UIView
而 loadViewFromNib
方法将 return 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
:
与IBInspectables
:
我正在处理一个我不明白的 XCode 错误,几天来我一直在寻找解决方案,Pods 更新,XCode 重启或其他任何事情似乎都无法解决问题......
我有一个从 UIButton 扩展而来的自定义 class:
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 复制粘贴的代码:
我的 xib 文件如下所示:
我现在保持简单,昨天我尝试了一个更复杂的(是的,2 个标签和一个 imageview Woooh,复杂 xcode ...),我有同样的错误..
错误是:
预编译:
应用程序启动后它崩溃了,我遇到了这个:
30 let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIButton
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
31 let view = loadViewFromNib()
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
32 setup()
线程 1:EXC_BAD 访问(代码 = 2,地址 = 0x16fc5bfd0)
我得到了从 31 到 2840 的那些错误...
我看到这是一个 XCode 错误,对此我们无能为力,但我确实需要一个带有 2 个标签和一个 ImageVIew 的自定义按钮 ...
您需要 UIView's
class 只是 UIView
,而不是您的自定义 class,您的自定义 class 是 File's owner
在这种情况下。
您在加载时实例化此视图,因此如果自定义 class 将成为您的 class,它将一遍又一遍地 运行...
笔尖:
使用 UIButton
创建一个 UIView
作为子视图(如果您的视图是某个 UIView,您将其 class 更改为 UIButton
,您的 IBActions
将无法工作,所以最好使用 UIButton
作为子视图)
而您的 File's owner
是您的习惯 class:
现在您可以按住 IBOutlets
并拖动到 File's owner
,只需按住 File's owner
拖动到所需的视图即可:
您可以对按钮 IBActions
执行相同的操作
您的代码会稍微改变一下:
习俗class如前所述是UIView
:
@IBDesignable class CustomCardButton: UIView
而 loadViewFromNib
方法将 return 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
:
与IBInspectables
: