2014-12-22 4 views
1

이들 각각은 다른 생성자를 호출합니다.dequeueReusableCellWithIdentifier 내부의 문자열 대 NSStringFromClass

let cell = tableView.dequeueReusableCellWithIdentifier(NSStringFromClass(MessageSentDateCell), forIndexPath: indexPath) as MessageSentDateCell 
let cell = tableView.dequeueReusableCellWithIdentifier("MessageSentDateCell", forIndexPath: indexPath) as MessageSentDateCell 

최고 전화 :

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

두 번째 줄은 호출

required init(coder aDecoder: NSCoder) 

그러나, 내가 말하는 겁니다 샘플 프로젝트 저장소에, required init(coder aDecoder: NSCoder) 정말 구현되지 않습니다. 그래서 첫 번째 생성자를 호출하려고합니다. 두 번째 줄이 첫 번째 생성자를 대신 호출하지 않는 이유는 무엇입니까?

예, 클래스 이름과 식별자는 동일합니다.

+0

적절한 기술은 UI를 구현하는 방법에 따라 다릅니다. 스토리 보드 셀 프로토 타입입니까? NIB? 아니면 프로그래밍 방식으로 셀을 인스턴스화합니까? – Rob

+0

내가 지정한 클래스에 맞는 스토리 보드 셀 프로토 타입을 사용하고 있습니다. – user83039

+1

그리고 모든 IBOutlet을 셀 하위 클래스의 속성에 연결 했습니까? 그런 다음'initWithCoder'를 호출 할 두 번째'dequeueReusableCellWithIdentifier'는 커스텀 서브 클래스를 인스턴스화 할 때 스토리 보드가 호출하는 적절한 메소드입니다. 'initWithCoder' 메소드 내에 커스텀 초기화를하거나,'initWithCoder'가 완료되었을 때'cellForRowAtIndexPath'가 필요한 추가 설정을하도록하십시오. 그리고 (콘센트가 아닌) 특별한 설정이 필요 없다면, 단순히'initWithCoder'를 구현할 필요가 없습니다. – Rob

답변

2

스토리 보드에 셀을 프로토 타입 셀로 설정 한 경우 initCoder 초기화 프로그램이 호출되어야하는 초기화 프로그램보다 높습니다. 이는 셀이 스토리 보드 파일로 인코딩되고 비 직렬화로 생성되기 때문입니다. initStyle:reuseIdentifier:은 proramatically 생성 된 세포입니다.

두 가지 호출이 다른 결과를 생성하는 이유는 예상대로 NSStringFromClass가 "MessageSentDataCell"을 반환하지 않기 때문입니다. 스위프트 클래스는 모듈 이름 및 기타 정보를 포함하도록 맹 글링되어 동일한 클래스가 여러 모듈에 존재할 수 있습니다.

디큐가 실패하지 않으므로 MessageSentDateCell 클래스를 동일한 NSStringFromClass 메소드를 사용하는 프로토콜과 별도로 tableview에 등록해야합니다.

프로그래밍 방식으로 셀을로드하고 스토리 보드에서 프로토 타입을 제거하거나 스토리 보드에 고정해야합니다. 프로토 타입 셀에 대해 추가 설정이 필요한 경우 셀 하위 클래스의 awakeFromNib 메소드에서 수행해야합니다. 이는 모든 콘센트가 이미 연결되면 호출되기 때문입니다.

관련 문제