내 앱의 경우 UI는 같지만 콘텐츠에 따라 각 셀에 대해 다른 기능 을 가진 일반 셀 형식을 원합니다 . 이 작업을 수행하는 쉬운 방법은 ToggleCell이라는 @IBOutlets를 사용하여 uitableviewcell의 하위 클래스를 만드는 것이라고 생각했습니다.
class ToggleCell: UITableViewCell {
// @IBOutlets here
}
그것의 클래스로 nib 파일을 만드십시오 . 그런 다음 TaskCell이라는 사용자 지정 기능을 사용하여 하위 클래스를 만들었습니다.
class TaskCell: ToggleCell {
func load() {
// do stuff
}
}
그러나 cellForRowAtIndexPath에서 셀을 제거하면 다운 캐스팅이 실패합니다.
let cell = cellForRowAtIndexPath(...) as! TaskCell
내가 무엇을 잘못하고 있지? 이 작업을 더 잘 수행 할 수있는 방법이 있습니까?
registerClass
메소드를 사용하여 테이블보기에 셀 클래스를 등록해야합니다 . 그러나 접근 방식에는 더 근본적인 문제가 있습니다. 단일 NIB는 이미 ToggleCell
임의의 하위 클래스로 다운 캐스트 할 수없는 특정 셀 클래스 (수퍼 클래스 )를 정의합니다 . 대신해야 할 일은 셀의 사용자 정의 콘텐츠보기에 대한 NIB 및 클래스를 만들고 수퍼 클래스에로드하는 것입니다 ToggleCell
.
class ToggleCellContentView: UIView {
// Connect outlets in ToggleCellContentView.xib
@IBOutlet weak var label: UILabel!
}
class ToggleCell: UITableViewCell {
let view: ToggleCellContentView
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
// Load custom content view from NIB
view = NSBundle.mainBundle().loadNibNamed("ToggleCellContentView",
owner: nil, options: nil)[0] as! ToggleCellContentView
super.init(style: .Default, reuseIdentifier: reuseIdentifier)
// Add custom content view as subview
contentView.addSubview(view)
// Make custom content view span the cell
view.setTranslatesAutoresizingMaskIntoConstraints(false)
let viewDict = ["view": view]
contentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: nil, metrics: nil, views: viewDict))
contentView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: nil, metrics: nil, views: viewDict))
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TaskCell: ToggleCell {
func load() {
// do stuff
}
}
class OtherTaskCell: ToggleCell {
func load() {
// other do stuff
}
}
그런 다음 테이블보기에 셀 클래스를 등록하십시오.
tableView.registerClass(TaskCell.self, forCellReuseIdentifier: "taskCell")
tableView.registerClass(OtherTaskCell.self, forCellReuseIdentifier: "otherTaskCell")
데이터 소스 메서드에서 deque
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let taskcell = tableView.dequeueReusableCellWithIdentifier("taskcell", forIndexPath: indexPath) as! TaskCell
taskcell.view.label.text = "Row \(indexPath.row)"
return taskcell
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다