问题
I can not seem to get the "titleText" IBInspectable attribute working. I have a simple framework view with a UILabel which I create an IBInspectable variable "titleText". I note the inspectable "layer" variables work as expected, but not my custom "titleText" which is supposed to update the main view using this framework.
Issues are:
Interface Builder not updating the titleLabel? (i.e. at design time) i.e. I'm expecting that this should, just like it is working for the "layer" items.
At Run Time the value of titleLabel is not picking up the value I set in IB either. Note that I get the following output when I run, i.e. my code that produces this is finding the "self.titleLabel" is actually nil??
CODE SUMMARY
(a) gcCustomView.xib Snapshot
(b) gcCustomerView.swift
import UIKit
@IBDesignable
class gcCustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBInspectable var titleText: String = "Default" {
didSet {
if self.titleLabel != nil {
self.titleLabel.text = titleText
} else {
NSLog("Could not set title text as label.text was nil : was trying to set to \(titleText)")
}
}
}
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.cgColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
commitInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commitInit()
}
// Private
func commitInit() {
if self.subviews.count == 0 {
print("Loading Nib")
//let bundle = Bundle(forClass: self.dynamicType)
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "gcCustomView", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
}
}
}
(c) Main.storyboard Snapshot
回答1:
Select gcCustomView.xib
File's Owner
change class name to gcCustomerView
.
Right click on the Label
drag from outlet
to File Owner
Now It should look like this if you right click Label
I made a demo project. It is working ok. If you still have problem let me know. I'll upload my demo project in Github.
回答2:
if you want to use xib make sure you have set your class name in fileowner
to do that first
Now add class name
And add IBOutlet
refer Reuse a uiview xib in storyboard
回答3:
This is the memory issue.Label has no memory here. Therefore it returns 0 Instead of loading the nib in custom class you should load it in ViewController. Replace your gcCustomView with the following code.
gcCustomView.swift
import UIKit
@IBDesignable
class gcCustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
if self.titleLabel != nil {
self.titleLabel.text = "Default"
}
else {
NSLog("Could not set title text as label.text was nil : was trying to set to default")
}
}
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.cgColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
// commitInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// commitInit()
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.loadNib()
}
func loadNib() {
let obj = Bundle.main.loadNibNamed("gcCustomView", owner: nil, options: nil)?[0] as! gcCustomView
obj.frame = (self.view.bounds)
self.view.addSubview(obj)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Then build. It will work.
回答4:
Remove Keypath parameter in custom view and run.It's worked for me. :)
来源:https://stackoverflow.com/questions/40560061/ibinspectable-with-cocoa-touch-framework-not-working-code-attached