2016-11-12 12 views
6

मुझे "शीर्षक टेक्स्ट" IBInspectable विशेषता काम नहीं कर रहा है। मेरे पास UILabel के साथ एक साधारण रूपरेखा दृश्य है जिसे मैं एक आईबीआईएसपेक्टेबल चर "शीर्षक टेक्स्ट" बना देता हूं। मुझे लगता है कि निरीक्षण योग्य "परत" चर अपेक्षित काम करते हैं, लेकिन मेरा कस्टम "शीर्षक टेक्स्ट" नहीं है जो इस ढांचे का उपयोग करके मुख्य दृश्य को अद्यतन करना है।कोको टच फ्रेमवर्क के साथ IBInspectable काम नहीं कर रहा है? (कोड संलग्न)

मुद्दे हैं:

  1. इंटरफ़ेस बिल्डर titleLabel अपडेट नहीं हो? (यानि डिजाइन समय पर) यानी मैं उम्मीद कर रहा हूं कि ऐसा होना चाहिए, जैसे कि यह "परत" वस्तुओं के लिए काम कर रहा है।

  2. रन टाइम पर शीर्षक लेबल का मान आईबी में निर्धारित मूल्य को नहीं उठा रहा है। ध्यान दें कि जब मैं दौड़ता हूं तो मुझे निम्न आउटपुट मिलता है, यानी मेरा कोड जो इसे उत्पन्न करता है "self.titleLabel" वास्तव में शून्य है ??

कोड सारांश

enter image description here

(क) gcCustomView.xib स्नैपशॉट enter image description here

(ख) 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) 
     } 
    } 

} 

(ग) Main.storyboard स्नैपशॉट

enter image description here

उत्तर

4

gcCustomView.xibFile's Owner कक्षा का नाम gcCustomerView में बदलें।

enter image description here

सही outlet से File Owner

enter image description here

अब यह इस तरह दिखना चाहिए करने के लिए Label खींचें पर क्लिक करें यदि आप सही क्लिक Label

enter image description here

मैंने एक डेमो परियोजना बनाई। यह ठीक काम कर रहा है। यदि आपको अभी भी समस्या है तो मुझे बताएं। मैं गीथूब में अपना डेमो प्रोजेक्ट अपलोड करूंगा।

+1

बहुत धन्यवाद - यह उत्तर सबसे अच्छा है जहां मैं गलत हो गया था और दस्तावेजों को सही करने के लिए दस्तावेज किया गया था – Greg

2

आप xib उपयोग करने के लिए fileowner में सुनिश्चित करें कि आप अपने वर्ग के नाम निर्धारित किया है बनाना चाहते हैं, तो

कि पहले

enter image description here

अब वर्ग के नाम

जोड़ने करने के लिए

enter image description here

और जोड़ने IBOutlet

उल्लेख Reuse a uiview xib in storyboard

+0

मैंने फ़ाइलधारक को जोड़ा लेकिन इससे मदद नहीं मिली ... मैं आपके द्वारा भेजे गए लिंक की समीक्षा करूंगा – Greg

2

यह स्मृति issue.Label कोई स्मृति यहाँ है। इसलिए यह कस्टम क्लास में nib लोड करने के बजाय 0 देता है, आपको इसे 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. 
    } 
} 

फिर निर्माण। यह काम करेगा।

0

कस्टम दृश्य और रन में कीपैथ पैरामीटर निकालें। यह मेरे लिए काम करता है। :)

संबंधित मुद्दे