2016-10-02 12 views
0

StoryboardのカスタムUIViewサブクラスを直接作成するための完璧なソリューションを作成しようとしています。しかし、私は一切の解決策を見出しませんでした。ストーリーボードとViewControllerの両方からxibをロードできるようにする

ストーリーボードによるIBDesignableソリューションの場合、私はこの例に続き、http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6と完全に動作します。

しかし、私は、この拡張メソッドを呼び出すことによってUIViewControllerを通じてこのサブクラスを呼び出そう:

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

それがクラッシュしたとthis class is not key value coding-compliant for the keyを見逃していると言います。

誰も私と共有する解決策を両方の可能性を持って見つけましたか?

私はストーリーボードにこのUIViewを使用する必要がありますので、それを必要とし、またUITableview SectionHeader

+0

: はViewForHeaderInSection方法では、私がこれを書きました。しかし、ストーリーボードを使用するたびにストーリーボード上で再設計する必要があります。このビューをUITableViewのヘッダとして使いたいので、xibsだけを使ってこれを行う方法があります。うまくいけば、このスレッドを見てそれはあなたを助けるでしょう。 http://stackoverflow.com/questions/31693901/design-uitableviews-section-header-in-interface-builder – Adeel

+0

あなたが言っているのは、xibファイルを作成してストーリーボードに使用することも、インスタンス化することもできないということですNSBundle.mainBundle()を介してviewcontrollerで? – Bellots

+0

下記の私の答えをご覧ください。 – Adeel

答えて

1

両方のケースを維持するために、私は私のサブクラスの宣言内でこれを書くために好​​適:

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

このように、私が見て、私のstoryboard内でそれを追加することができます。

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 

} 

そしてそれが動作します。)

あなたが迅速クラスが絵コンテとXIBファイルの両方に使用することができることを理解する必要があり
0

としてここであなたがUITableViewのセクションヘッダとしてお使いの場合には(絵コンテからインスタンス化されたビューコントローラにXIBを使用する方法です)。

  1. (ビューコントローラクラスのviewDidLoad方法でからインスタンス化されたものを
  2. を、XIBファイルを作成し、あなたのインターフェイスを設計し、あなたの迅速なファイルのIBOutletsとUI要素のに必要な接続ストーリーボード)

    // Name your xib and swift class as Header 
    
    let headerNib = UINib(nibName: "Header", bundle: nil) 
    self.tableView.registerNib(headerNib, forHeaderFooterViewReuseIdentifier: "header") 
    
  3. UITableViewDelegate方法を実装viewForHeaderInSection

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

これだけです。

関連する問題