IBInspectable with Cocoa Touch Framework not worki

2019-06-18 07:08发布

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:

  1. 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.

  2. 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

enter image description here

(a) gcCustomView.xib Snapshot enter image description here

(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

enter image description here

4条回答
Anthone
2楼-- · 2019-06-18 07:13

Select gcCustomView.xib File's Owner change class name to gcCustomerView.

enter image description here

Right click on the Label drag from outlet to File Owner

enter image description here

Now It should look like this if you right click Label

enter image description here

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.

查看更多
Melony?
3楼-- · 2019-06-18 07:16

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.

查看更多
Emotional °昔
4楼-- · 2019-06-18 07:20

if you want to use xib make sure you have set your class name in fileowner

to do that first

enter image description here

Now add class name

enter image description here

And add IBOutlet

refer Reuse a uiview xib in storyboard

查看更多
【Aperson】
5楼-- · 2019-06-18 07:34

Remove Keypath parameter in custom view and run.It's worked for me. :)

查看更多
登录 后发表回答