7

「titleText」IBInspectable 属性が機能していないようです。IBInspectable 変数「titleText」を作成する UILabel を持つ単純なフレームワーク ビューがあります。検査可能な「レイヤー」変数は期待どおりに機能しますが、このフレームワークを使用してメインビューを更新することになっているカスタム「titleText」は機能しません。

問題は次のとおりです。

  1. Interface Builder が titleLabel を更新していませんか? (つまり、設計時)つまり、「レイヤー」アイテムで機能しているように、これが機能することを期待しています。

  2. 実行時に、titleLabel の値も IB で設定した値を取得していません。実行すると次の出力が得られることに注意してください。つまり、これを生成するコードは、「self.titleLabel」が実際には nil であることがわかりますか??

コードの概要

ここに画像の説明を入力

(a) gcCustomView.xib スナップショット ここに画像の説明を入力

(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) メイン絵コンテのスナップショット

ここに画像の説明を入力

4

4 に答える 4

4

gcCustomView.xib File's Ownerクラス名を に変更を選択しgcCustomerViewます。

ここに画像の説明を入力

Labelからドラッグをoutlet右クリックFile Owner

ここに画像の説明を入力

右クリックすると、このように見えるはずですLabel

ここに画像の説明を入力

デモプロジェクトを作りました。正常に動作しています。それでも問題が解決しない場合はお知らせください。デモ プロジェクトを Github にアップロードします。

于 2016-11-16T09:11:54.833 に答える
2

これはメモリの問題です。Label にはメモリがありません。したがって、0 が返されます。nib をカスタム クラスにロードする代わりに、ViewController にロードする必要があります。gcCustomView を次のコードに置き換えます。

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

次にビルドします。それが動作します。

于 2016-11-16T08:10:55.940 に答える
0

カスタム ビューで Keypath パラメータを削除して実行します。うまくいきました。:)

于 2016-12-21T05:51:57.783 に答える