iOS Swift - UITableViewCell 自定义子类不显示内容

Posted

技术标签:

【中文标题】iOS Swift - UITableViewCell 自定义子类不显示内容【英文标题】:iOS Swift - UITableViewCell Custom Subclass not displaying content 【发布时间】:2014-06-26 03:00:42 【问题描述】:

我有一个在 UIStoryboard 中创建的 UITableView,它有两个动态原型 UITableViewCells:

屏幕截图将显示我将第一个 UITableViewCell 的样式设置为 Subtitle,第二个设置为自定义,并在中心带有标签“Tap to Add”。第一个具有标识符“Cell”,第二个具有标识符“AddCell”。我已经设置了一个 UITableViewController(我还在 UIViewController 中尝试了一个 UITableView)、Swift 中的 UITableViewCell 子类,并且我已经连接了我所有的插座。但是,当我运行模拟器时,单元格已加载并且可以点击,但我无法让它显示任何内容。 (我尝试添加其他控件,但加载单元格时不会出现任何内容。我唯一可以更改的是 contentView 的 backgroundColor。)

我有以下 UITableViewController 的 Swift 代码:

import UIKit

class ListTableViewController: UITableViewController 

    var listObjects: ListObject[] = DataManager.instance.allListObjects() as ListObject[]

    init(style: UITableViewStyle) 
        super.init(style: style)
        // Custom initialization
    

    init(coder aDecoder: NSCoder!) 
        super.init(coder: aDecoder)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        self.tableView.registerClass(AddListObjectTableViewCell.classForCoder(), forCellReuseIdentifier: "AddCell")
    
    @IBAction func editButtonPressed(editButton: UIBarButtonItem) 
        if (self.tableView.editing) 
            editButton.title = "Edit"
            self.tableView.setEditing(false, animated: true)
         else 
            editButton.title = "Done"
            self.tableView.setEditing(true, animated: true)
        
    

    // #pragma mark - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int 
        return 1
    

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int 
        return listObjects.count + 1
    


    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! 

        let cellIdentifier = (indexPath.row < listObjects.count) ? "Cell" : "AddCell"
        var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell

        if (indexPath.row < listObjects.count) 
            let currentListObject : ListObject = listObjects[indexPath.row]
            cell.textLabel.text = currentListObject.name
            cell.detailTextLabel.text = currentListObject.detail
         else 
            cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as AddListObjectTableViewCell
            if (cell == nil) 
                cell = AddListObjectTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)
            
        

        return cell
    

    override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
        if (indexPath.row < listObjects.count) 

         else 
            self.performSegueWithIdentifier("AddListObjectShow", sender: self)
        

        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    

    // Override to support conditional editing of the table view.
    override func tableView(tableView: UITableView?, canEditRowAtIndexPath indexPath: NSIndexPath?) -> Bool 

        return (indexPath?.row < listObjects.count) ? true : false
    

我的 UITableViewCell 也有以下 Swift:

import UIKit

class AddListObjectTableViewCell: UITableViewCell 

    @IBOutlet var addLabel : UILabel

    init(style: UITableViewCellStyle, reuseIdentifier: String) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        // Initialization code
    

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    

最后,这是模拟器的屏幕截图,选中后可以看到空单元格:

我已经仔细检查了我所有的插座都已连接,我的类名在 Interface Builder 中设置正确,我已经用 tableView 注册了我的 UITableViewCell 的类,并且一切似乎都配置正确。这可能是一个错误吗?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我认为这与 Storyboard 中的大小有关。现在似乎它喜欢默认为更宽的视图,包括我在内的大多数人(根据您的故事板视图宽度判断,您)更喜欢将宽度设置为“紧凑”。

在情节提要中,尝试将宽度/高度设置为任意/任意,或者在检查器中将单元格内的标签一直向下滚动并播放“已安装”复选框,您会注意到它有多种调整大小的选项班级。如果它像我的一样,您将取消选中第一个“已安装”,并选中第二个用于您的尺寸选项。我删除了自定义的“已安装”并检查了默认选项,然后将我的标签移动到位。

我不相信我有足够的声誉来发布超过 1 个图像或 2 个链接,希望我能更容易地解释我的意思。

【讨论】:

问题是我添加到 UITableViewCell 子类的标签没有为选定的情节提要大小选择已安装复选框。谢谢。 我的一些 AutoLayout 约束没有安装,所以也要检查一下!【参考方案2】:

我花了很多时间来找出为什么我的样本与此处所述的相同问题无法正常工作。我正在使用故事板和 swift 2 (xcode 7.2)。

一旦我删除

self.tableView.registerClass(AddListObjectTableViewCell.classForCoder(), forCellReuseIdentifier: "AddCell")"

在 viewDidLoad() 中它对我有用。我只是按照本示例中所述使用 dequeueReusableCellWithIdentifier() 填充单元格,就是这样......

亲切的问候, 米歇尔

【讨论】:

以上是关于iOS Swift - UITableViewCell 自定义子类不显示内容的主要内容,如果未能解决你的问题,请参考以下文章

iOS:Xcode 似乎在 XIB 文件名中插入了一个额外的空格,导致“无法加载 XIB 文件”问题

ios 整理(一)swift和oc的区别

iOS-Swift-UIView

iOS开发中OC和swift的对比

ios OC、swift混编制作framework

iOS-swift-基础篇1