使用自定义 tableviewcell 以编程方式初始化 UITableViewController 的子类

programmatically init a subclass of UITableViewController with a custom tableviewcell

环境:xcode6、swift

我正在尝试使用 SLPagingViewSwift 作为根控制器,并且在其中一个页面中,我想使用自定义 UITableViewController。

我不知道为什么它不起作用,总是抛出2015-02-06 23:03:18.228 xiaoyu[4825:46536] 由于未捕获的异常而终止应用程序'NSInternalInconsistencyException', 原因: 'unable to dequeue a cell with identifier PersonCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'", 我已经在故事板中定义了标识符 'PersonCell'.

这里是主控制器的代码:

var controller: SLPagingViewSwift?

var ctr1 = PersonTableViewController()
var ctr2 = UIViewController()
var ctr3 = UIViewController()

override func viewDidLoad() {
    super.viewDidLoad()


    var navTitleLabel1 = UILabel()
    navTitleLabel1.text = "Home"
    navTitleLabel1.font = UIFont(name: "Helvetica", size: 20)
    navTitleLabel1.textColor = UIColor.whiteColor()
    var navTitleLabel2 = UILabel()
    navTitleLabel2.text = "Discover"
    navTitleLabel2.font = UIFont(name: "Helvetica", size: 20)
    navTitleLabel2.textColor = UIColor.whiteColor()
    var navTitleLabel3 = UILabel()
    navTitleLabel3.text = "Activity"
    navTitleLabel3.font = UIFont(name: "Helvetica", size: 20)
    navTitleLabel3.textColor = UIColor.whiteColor()

    var orange = UIColor(red: 255/255, green: 69.0/255, blue: 0.0/255, alpha: 1.0)
    var gray = UIColor(red: 0.84, green: 0.84, blue: 0.84, alpha: 1.0)


    ctr1.title = "Ctr1"
    ctr1.view.backgroundColor = UIColor.whiteColor()
    ctr2.title = "Ctr2"
    ctr2.view.backgroundColor = UIColor.yellowColor()
    ctr3.title = "Ctr3"
    ctr3.view.backgroundColor = UIColor.blueColor()

    controller = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], controllers: [ctr1,ctr2,ctr3], showPageControl: false)

    controller?.currentPageControlColor = UIColor.whiteColor()
    controller?.tintPageControlColor = UIColor(white: 0.799, alpha: 1.0)
    controller?.pagingViewMoving = ({ subviews in
        for v in subviews {
            var lbl = v as UILabel
            var c = gray

            if(lbl.frame.origin.x > 45 && lbl.frame.origin.x < 145) {
                c = self.gradient(Double(lbl.frame.origin.x), topX: Double(46), bottomX: Double(144), initC: orange, goal: gray)
            }
            else if (lbl.frame.origin.x > 145 && lbl.frame.origin.x < 245) {
                c = self.gradient(Double(lbl.frame.origin.x), topX: Double(146), bottomX: Double(244), initC: gray, goal: orange)
            }
            else if(lbl.frame.origin.x == 145){
                c = orange
            }
            lbl.textColor = c
        }
    })


    controller?.didChangedPage = ({ currentIndex in
        println(currentIndex)
    })

    self.setViewControllers([controller!], animated: true)
}

PersonTableViewController 是自定义的 TableViewController,在那个控制器中,我使用了自定义的 tableviewcell。

这是 PersonTableViewController 的代码:

    override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as PersonTableViewCell
    cell.name.text = "aaa"

    return cell
}

您的 viewDidLoad 方法应该使用 table 视图注册单元格 class。 UITableViewController的方法是:

func registerClass(_ cellClass: AnyClass,forCellReuseIdentifier identifier: String)

因此,在您的情况下它将是:

ctr1.registerClass(PersonTableViewCell.self, forCellReuseIdentifier: "PersonCell")