场景:
原先的项目使用的是swift1.2+storyboard,下载了Xcode7 GM版本,打开项目之后,首先提示的是各种语法修改,按照提示,将语法修改完之后,程序编译运行一切OK。
点击storyboard,结果环境给出了这种的错误提示(可正常编译运行),入下图所示:
ZLAttributedPlaceHolderTextField实现如下:
import UIKit
@IBDesignable
class ZLAttributedPlaceHolderTextField: UITextField {
@IBInspectable var placeHolderColor : UIColor = UIColor(white: 0.7, alpha: 1.0) {
didSet {
updateAttributedPlaceHolder()
}
}
@IBInspectable var placeHolderFontSize : CGFloat = 14 {
didSet {
updateAttributedPlaceHolder()
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func updateAttributedPlaceHolder() {
if self.placeholder != nil {
var attributes = [String : AnyObject]()
attributes[NSForegroundColorAttributeName] = self.placeHolderColor
attributes[NSFontAttributeName] = UIFont.systemFontOfSize(self.placeHolderFontSize)
self.attributedPlaceholder = NSAttributedString(string: self.placeholder!, attributes: attributes)
}
}
}
主要是想在storyboard里面就可以自由设置attributedPlaceholder
属性,而不需要再在代码里去实现。
按照错误提示,一开始是以为约束的问题,但是,检查了一下,约束并没有任何问题,随后发现如下图有这个提示:
点击DEBUG,直接断在如下所示:
不知所以然,根据图2的提示性信息,Designables Crashed,将代码里的
@IBDesignable
注释掉,OK,没有任何问题
个人理解:
该类自定义keyPath属性,内部又调用了其它方法,导致系统无法顺利执行并进行渲染。而对于一些简单的属性,例如如下的内容:
@IBDesignable
extension UIView {
@IBInspectable var cornerRadius : CGFloat {
set {
self.layer.cornerRadius = newValue
}
get {
return self.layer.cornerRadius
}
}
@IBInspectable var borderWidth : CGFloat {
set {
self.layer.borderWidth = newValue
}
get {
return self.layer.borderWidth
}
}
@IBInspectable var borderColor : UIColor {
set {
print("\(newValue)", terminator: "")
self.layer.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.layer.borderColor!)
}
}
}
就不会出现上面的那种错误信息。
@IBDesignable无伤大雅,有没有,感觉都无所谓
或许个人理解有误,欢迎拍砖。至于网上说的那些
- Runpath Search Paths 添加
$(CONFIGURATION_BUILD_DIR)
- 删除 DerivedData
- Clean Project Cmd + K
- 重启Xcode
等等方法,都尝试了,然并卵