拆分视图控制器 - 自定义 UITableViewCell

Posted

技术标签:

【中文标题】拆分视图控制器 - 自定义 UITableViewCell【英文标题】:Split View Controller - Custom UITableViewCell 【发布时间】:2015-09-06 13:02:14 【问题描述】:

我正在尝试将自定义 UITableViewCell 添加到我的拆分视图控制器主控。当我运行我的应用程序时,单元格不会出现,尽管它们确实携带了 println 语句所确认的信息。经过一番研究,我发现只生成了标准的 UITableViewCells。

Table ViewController 有通过 Storyboard 连接的 Data Source 和 Delegate,而 UITableViewCell 有一个带有 Identifier 的自定义 Class。

TableView 和 TableViewCell 在同一个 ViewController 中。

TableViewCell 可重用标识符是“ArtistCell”,它的类是 ArtistCell。

import UIKit
import MediaPlayer

class ArtistsMasterTableViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource 
    var artistsQuery:MPMediaQuery!
    var artists:NSArray!
    var artistAlbums:NSArray!

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        artistsQuery = MPMediaQuery.artistsQuery()
        artists = artistsQuery.collections
    

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return artists.count
    

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
        println(artists[indexPath.row].items)
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("ArtistCell", forIndexPath: indexPath) as! ArtistCell

        cell.backgroundColor = UIColor.clearColor()

        var rowItem:MPMediaItem = artists.objectAtIndex(indexPath.row).representativeItem

        if let artwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as? MPMediaItemArtwork 
            cell.artistImage!.image = artwork.imageWithSize(cell.artistImage.bounds.size)
        

        cell.artistNameLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
        //        artistCell.albumsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
        //        artistCell.songsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String

        return cell


自定义单元格:

class ArtistCell: UITableViewCell 

    @IBOutlet weak var artistImage: UIImageView!
    @IBOutlet weak var artistNameLabel: UILabel!
    @IBOutlet weak var albumsLabel: UILabel!
    @IBOutlet weak var songsLabel: UILabel!


以下是一些故事板屏幕截图:

【问题讨论】:

您是否将单元格设计为同一故事板文件中表格视图的原型单元格? 是的,单元格是一个原型并且在同一个情节提要中。 它们是否也在同一个 ViewController 中? 是的,Table View 和 Table View Cell 都在同一个 ViewController 中。 在IB中检查你的cell的reuse id,是ArtistCell吗? 【参考方案1】:

很好的问题。从我所看到的实现方式来看,这是创建一个自定义 xib 文件,您可以将其出列。这是 Objective-c 中关于该主题的最佳文章:https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722

基本上,您执行以下操作:

    设置您的表格,就像减去可重复使用的单元格一样 创建一个自定义 xib 文件并使其看起来像您的原型单元格(您可以通过创建一个空对象并将 tableviewcell 拖到情节提要上来简单地做到这一点

    确保在 Identity Inspector 中将 xib 的类类型设置为 ArtistCell

    创建一个自定义类 ArtistCell 以将 xib 连接到

    在设置 cellForRowAtIndexPath 时使用此代码

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? ArtistCell
    
    if cell == nil
        tableView .registerNib(UINib(nibName: "ArtistCell", bundle: nil), forCellReuseIdentifier: "cell")
        cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? ArtistCell
    
    
    cell?.nameLabel.text = "Hello World"
    
    return cell!
    
    

这是一个屏幕截图以防万一:

此代码已经过全面测试,适用于我。供参考。 :-) 希望这会有所帮助!

干杯! 罗伯·诺贝克

【讨论】:

以上是关于拆分视图控制器 - 自定义 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 UITableView 子视图

在自定义容器控制器中拆分视图控制器?

使用代码在拆分视图控制器中显示 UITableView

如何在自定义 UIView 中添加 UITableView?

UISearchController 作为 UITableViewHeader

无法将内容添加到 IB 视图控制器中的自定义表格视图单元格