2016-10-02 3 views
0

Ich versuche, die perfekte Lösung zu erstellen, um eine benutzerdefinierte UIView Unterklasse direkt aus Code und in Storyboard. Ich habe jedoch keine Lösung gefunden.Kann Xib aus Storyboard und ViewController laden

Für eine IBDesignable Lösung durch Storyboard, folgte ich diesem Beispiel http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6 und funktioniert perfekt.

Aber wenn ich versuchen, diese Unterklasse durch UIViewController aufrufen, indem Sie diese Erweiterung Methode aufrufen:

extension UIView { 
    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? { 
     return UINib(
      nibName: nibNamed, 
      bundle: bundle 
     ).instantiateWithOwner(nil, options: nil)[0] as? UIView 
    } 
} 

Es stürzt ab und sagt, dass this class is not key value coding-compliant for the key vermisst.

Hat jemand eine Lösung gefunden, um mit mir beide Möglichkeiten zu teilen?

Ich brauche es, weil ich diese UIView in Storyboard und auch als UITableview SectionHeader

+0

Sie müssen verstehen, dass eine rasche Klasse kann sowohl verwendet werden, für die Storyboards und xib Dateien. Aber Sie müssen es jedes Mal auf dem Storyboard neu gestalten, wenn Sie es verwenden möchten. Da Sie diese Ansicht als UITableView-Header verwenden möchten, gibt es eine Möglichkeit, dies nur mithilfe von xibs zu tun. Schau dir diesen Thread hoffentlich an. http://stackoverflow.com/questions/31693901/design-guidableviews-section-header-in-interface-builder – Adeel

+0

Also was Sie sagen, ist, dass ich nicht erstellen kann eine XIB-Datei und verwenden Sie es für jedes Storyboard oder instanziieren Sie es im Viewcontroller durch NSBundle.mainBundle()? – Bellots

+0

Bitte sehen Sie meine Antwort unten. – Adeel

Antwort

1

beiden Fälle zu bewahren, zog ich diese Erklärung in meiner Unterklasse zu schreiben:

@IBDesignable class CustomView: UIView { 

    var view: UIView! 

    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var label: UILabel! 


    func xibSetup() { 
     view = loadViewFromNib() 
     view.frame = bounds 
     view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] 
     addSubview(view) 
    } 

    func loadViewFromNib() -> UIView { 

     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: "CustomView", bundle: bundle) 
     let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView 

     return view 
    } 


    override init(frame: CGRect) { 
     super.init(frame: frame) 
     xibSetup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     xibSetup() 
    } 
} 

Auf diese Weise kann ich es in meinem storyboard sehen und hinzufügen. In ViewForHeaderInSection Methode, schrieb ich folgendes:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

let header = UIView() 

let view:CustomView = CustomView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 30)) 

view.label.text = "header title: \(section)" 

header.addSubview(view) 


return header 

} 

Und so funktioniert es;)

0

Hier verwenden sollten, wie Sie ein xib in einem View-Controller verwenden können, die aus Storyboard (in Ihrem Fall als Sektionskopf eines UITableView instanziiert).

  1. Eine xib Datei, entwerfen sie ihre Schnittstelle und die notwendigen Verbindungen zu den UI-Elementen mit dem IBOutlets in Ihrer schnellen Datei
  2. In viewDidLoad Methode Ihrer View-Controller-Klasse (eine, die aus dem instanziiert Storyboard)

    // Name your xib and swift class as Header 
    
    let headerNib = UINib(nibName: "Header", bundle: nil) 
    self.tableView.registerNib(headerNib, forHeaderFooterViewReuseIdentifier: "header") 
    
  3. Implementieren des Verfahrens UITableViewDelegateviewForHeaderInSection

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    
    let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as! Header 
    // Customise your header view here 
    
    return header; 
    } 
    

Das ist alles was Sie tun müssen.

Verwandte Themen