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

标签 ios uitableview swift storyboard

环境:xcode6,swift

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

我不知道为什么它不起作用,总是抛出“2015-02-06 23:03:18.228 xiaoyu[4825:46536] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to使具有标识符 PersonCell 的单元格出列 - 必须为该标识符注册一个 nib 或一个类,或者在 Storyboard中连接一个原型(prototype)单元格”,并且我已经在 Storyboard中将标识符定义为“PersonCell”。

这里是主 Controller 的代码:

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,在该 Controller 中,我使用了自定义的 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 方法应该向 TableView 注册单元格类。 UITableViewController 的方法是:

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

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

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

关于ios - 使用自定义 tableviewcell 以编程方式初始化 UITableViewController 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28369292/

相关文章:

objective-c - 是否可以根据修改键更改 NSOpenPanel 的提示

ios - 带有弹出按钮和详细 View 的 Storyboard Segue

ios - prepareForSegue 什么时候被调用?

IOS Swift Spritekit 碰撞检测

ios - 设置表格 View 单元格的最小高度?

ios - 选择单元格时 UITableView 分隔符颜色发生变化

swift - 游戏套件 : NPC element is going to very high floating number coordinates and back on update

ios - 具有 1 个数据源的 tableview 单元格内的 Collectionview

ios - 在 swift 2 的一个部分中的单元格之间添加空间

ios - UITableView 中放大镜图标 “hook up” 的正确方法是什么?