2017-05-07 110 views
0

我有一個視圖,我用作tableView中的標題。視圖非常簡單,它只有內部標籤。如果我在其中定義一個帶有字符串賦值的自定義init,則不起作用。UIView與自定義init不起作用

的代碼如下

class ProducutDetailsTableViewHeader: UIView { 

var sectionTitle: UILabel = { 
    var label = UILabel() 
    label.textAlignment = .left 
    label.font = UIFont(name: "Lato-Regular", size: 13) 
    label.textColor = UIColor.init(red: 107/255, green: 107/255, blue: 118/255, alpha: 1.0) 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.numberOfLines = 0 
    label.translatesAutoresizingMaskIntoConstraints = false 
    return label 
}() 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    addSubview(sectionTitle) 

    sectionTitle.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 24).isActive = true 
    sectionTitle.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true 

    backgroundColor = UIColor.init(red: 242/255, green: 242/255, blue: 244/255, alpha: 1.0) 

} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

init(text: String) { 
    sectionTitle.text = text 
    super.init(frame: .zero) 
} 
} 

如果我使用下面的代碼,我沒有得到我的頭可見

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if section == 0 { 
     return ProducutDetailsTableViewHeader(text: "PREVED") 
    } 
    return nil 
} 

但有了這個代碼,一切正常

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if section == 0 { 
     let view = ProducutDetailsTableViewHeader() 
     view.sectionTitle.text = "Preved" 
     return view 
    } 
    return nil 
} 

看起來我對inits做錯了什麼。究竟是什麼?

回答

4

試着改變你的init(text: String)方法,看看,如果這個工程:

convenience init(text: String) { 
    self.init(frame: .zero) 
    sectionTitle.text = text 
} 

,當你調用super.init您所呼叫的UIViewController的默認init方法,而不是你的 init方法。通過調用self.init,確保您正在調用正確的方法。

+0

因此'self.init'調用這一行'override init(frame:CGRect)'...最終調用'super.init'的權利? – Honey

+0

是的,正確的,super.init調用父類,自我調用你所指的那個。 – Scriptable

0

如果你用nib使用自定義視圖,那麼就不需要單獨給出'init'方法。

在這種情況下,需要使用以下來加載從束視圖,

讓subViewArray = Bundle.main.loadNibNamed( 「NibName」,擁有者:自,選項:無) 讓子視圖= subViewArray [0 ]

如果你將使用init方法,你的視圖的內容將爲零。 讓我知道你是否有更多的疑問。