2017-03-27 9 views
1

인터페이스 빌더에서 사용자 정의 테이블 뷰 셀을 시각화하는 데 문제가 있습니다.스위프트 3 : 설계 가능한 테이블 뷰 셀

누구든지 @Designable 테이블 뷰 셀을 만드는 방법을 알고 있습니까?

테이블 뷰가있는 스토리 보드에서 사용자 정의 테이블보기 셀을 가져 오면 배경색 만 작동합니다. 표보기 셀 내에서 레이블의 텍스트를 설정하려고하면 인터페이스 빌더가 충돌합니다.

내 설정은 다음 방법에서 호출 :

- override public init(style: UITableViewCellStyle, reuseIdentifier: String?) 

- required public init?(coder aDecoder: NSCoder) 

나는 나의 레이블이 순간에 초기화되지 않기 때문에 그것의 생각?

코드 :

import UIKit 

@IBDesignable class ProgressHeaderTableViewCell: UITableViewCell { 

    @IBOutlet weak var headerLabel: UILabel! 

    // MARK: - View methods 

    override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     self.setupNib() 
    } 

    // MARK: - NSCoding 
    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.setupNib() 
    } 

    func setupNib(){ 
     self.backgroundColor = UIColor.blue 

//  self.headerLabel.text = "Hello world" 
    } 

} 

업데이트 코드 :

import UIKit 

@IBDesignable class CustomTableView: UITableViewCell { 

@IBOutlet weak var headerLabel: UILabel! 

// MARK: - View methods 
override func prepareForInterfaceBuilder() { 
    self.awakeFromNib() 
} 

override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    } 
} 


// MARK: - NSCoding 
required public init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    } 
} 


override func awakeFromNib() { 
    super.awakeFromNib() 

    self.backgroundColor = UIColor.blue 
    if headerLabel != nil { 
     self.headerLabel.text = "Hello world" 
    } 
} 

func setupNib(){ 
    let bundle = Bundle(for: CustomTableView.self) 
    guard let customView = bundle.loadNibNamed("CustomTableView",owner: self, options: nil)?.first as? CustomTableView else { 
     return 
    } 
    customView.frame = self.bounds 
    self.addSubview(customView) 
} 
} 

감사합니다!

+0

tbaleView 데이터 소스 메소드를 추가하십시오. – CodeChanger

+0

데이터 원본 메서드가 추가되었습니다. 내 디자인 가능한 UITableViewCell 안에 레이블을 설정하려고하는데, 이는 내 레이블에 IBOutlet이 있다는 것을 의미합니까? 그 때 초기화되어서는 안됩니까? – PAK

+0

더 명확히하기 위해 몇 가지 코드를 게시 할 수 있습니까? – CodeChanger

답변

1

여기에 살펴볼 수있는 몇 가지 문제가 있다고 생각합니다. 먼저 사용자 정의보기를 만들 때마다 xib 파일 이름과 연결해야합니다. 내가 XIB 파일을 작업 할 때마다

func setupNib(){ 
    let bundle = Bundle(for: ProgressHeaderTableViewCell.self) 
    guard let customView = bundle.loadNibNamed("NAME_OF_XIB_FILE_GOES_HERE",owner: self, options: nil)?.first as? ProgressHeaderTableViewCell else { 
     return 
    } 
    customView.frame = self.bounds 
    self.addSubview(customView) 
} 

또한, 나는 확실히 예상되는 요소 중 하나가 전무 있지 않은지 확인하기 위해 확인 후 awakeFromNib() 방법 내의보기 설정을한다.

override func awakeFromNib() { 
    if headerLabel != nil { 
     self.backgroundColor = UIColor.blue 
     self.headerLabel.text = "Hello world" 
    } 
} 

마지막으로, 나는 단지 내가 전류 파단이없는 것을 확인으로 설정 기능을 포장 할 때 작업 IBDesignables을 얻을 수있었습니다 :

override public init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    { 
} 

// MARK: - NSCoding 
required public init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    //check that there are no current subviews 
    if self.subviews.count == 0 { 
     self.setupNib() 
    { 
} 

PS I이었다 이것을 배우면, 나는이 블로그 게시물이 매우 유용하다는 것을 알았다. IBDesignable 및 사용자 정의보기에 대한 핸들을 얻기 위해 직접 읽을 수 있습니다. http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

+0

답장을 보내 주셔서 감사합니다! IB에서 작동하는 사용자 정의 셀을 사용할 수 없지만 이제는 더 이상 충돌하지 않습니다. 현재 실행중인 코드는 원래 게시물 ^^에서 업데이트됩니다. 위의 그림과 같이 prepareForInterfaceBuilder()를 사용했을 때 스토리 보드에서 내 사용자 정의보기 만 업데이트합니다. 배경색을 파란색으로 설정할 수 있습니다. 그러나 현재이 레이블은 아무 것도 없습니다. – PAK

+0

awake를 호출하지 않으면 해당 메소드가 호출됩니다. – faircloud

+0

제거하는 경우 : override func prepareForInterfaceBuilder() { self.awakeFromNib() } init (frame : CGRect) 메서드를 구현 한 항목이 없으므로 IB – PAK