2016-10-02 158 views
0

我在試圖創建一個完美的解決方案,直接從代碼和Storyboard自定義UIView子類。但是,我沒有找到任何解決方案。能夠從Storyboard和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

你要明白,迅速類可用於兩個故事板和廈門國際銀行文件。但是每次你想使用它時,你都需要在故事板上重新設計它。既然你想使用這個視圖作爲UITableView的頭部,所以有一種方法只能使用xibs來完成。看看這個線程希望它會幫助你。 http://stackoverflow.com/questions/31693901/design-uitableviews-section-header-in-interface-builder – Adeel

+0

所以你說的是,我不能創建一個xib文件,並將其用於故事板或實例化它在視圖控制器通過NSBundle.mainBundle()? – 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內。 在ViewForHeaderInSection方法,我寫了這個:

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 

} 

所以它的工作原理;)

0

這裏是你如何可以在從故事板實例化一個視圖控制器使用的廈門國際銀行(在你的情況爲UITableView的節頭)。

  1. 創建XIB文件,請設計接口,並在迅速文件
  2. 與IBOutlets UI元素的必要的連接。在您的視圖控制器類(一個viewDidLoad方法從實例化故事板)

    // 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; 
    } 
    

這就是你需要做的。

相關問題