自定义UITableViewCell仅显示一个UILabel,即使故事板上有两个UILabel

时间:2017-08-27 19:45:26

标签: ios swift xcode tableview

我正在与控制器进行简单的联系人应用程序:ContactTableViewController和custome cell:ContactTableViewCell。我创建了一个自定义表格视图单元格,其中样式为自定义,identifierContactTableViewCell,类也为ContactTableViewCell。 该单元格有两个UILabel字段,这些字段显示为ContactTableViewCell.swift类,如下所示:

import UIKit

class ContactTableViewCell: UITableViewCell {

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var info: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        print("cell loaded with name: ", name)
        // Initialization code
    }

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

        // Configure the view for the selected state
    }

}

现在我想在我的ContactViewController中显示它们,我的控制器的相关部分看起来像这样:

// MARK: - Table view data source    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }


    // here we communicate with parts of the app that owns the data
    override func tableView(_ tableView            : UITableView
                           , cellForRowAt indexPath: IndexPath
                           ) -> UITableViewCell {

        let id = "ContactTableViewCell"

        // deque a cell as an instance of ContactTableViewCell
        guard let cell = tableView.dequeueReusableCell(withIdentifier: id, for : indexPath)
        as? ContactTableViewCell else {

            fatalError("dequed cell is not instance of ContactTableViewCell")
        }

        cell.name.text = "hello"
        cell.info.text = "hello information"

然而,当我运行模拟时,我只看到两行“你好”,即使它应该是这样的:

hello
hello information
重复两次。这有什么问题?

3 个答案:

答案 0 :(得分:1)

这是一个禁忌问题。您必须为名称UILabel和信息UILabel定义高度,宽度,x和y定位。字体大小对UILabel的高度起主导作用,宽度可以基于UILabel x字体大小的字符数,因此您不必明确表达UILabel的高度和宽度约束,但对于UIButton,您必须明确定义x,y,width,height的约束。对于UILabel,我们只需要定义x和y约束。

当您没有明确定义UI元素的约束时会发生什么情况,您的View的呈现将具有不可预测的结果,并且UI元素通常不会出现在视图上。

从您的代码中可以看出,您正在使用XCode设计器添加UILabel,以便您可以使用它来添加约束。您也可以通过编程方式添加约束。但我很确定你使用的是XCode Storyboard设计师。

无论是以编程方式还是通过XCode设计器,您需要在超级视图的顶部和左侧添加名称UILabel的约束,您可以稍后重新定位,然后将信息UILabel的x和y对齐方式约束为UILabel,水平对齐名称UILabel和+8垂直间距到名称UILabel的底部,这将把信息UILabel放在下面,并以UILabel名称为中心。

请参阅本指南:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithConstraintsinInterfaceBuidler.html

此Stackoverflow回答:https://stackoverflow.com/a/34448801/1258525

不是我在这张图片中圈出的前两个约束,它定义了视频质量UILabel的x和y: enter image description here

然后看下面的下一个标签,Onset Threshold如何将自身限制在Video Quality标签的前沿,然后是VideoQuality标签下面的分隔符:

enter image description here

答案 1 :(得分:1)

很可能你没有足够的空间来放置两个标签。您可以通过以下方式在storyboard中设置行高:

  1. 选择您的tableview
  2. 转到尺寸检查员
  3. 更改Row Height
  4. Change row height

    OR

    您可以在tableView(_:heightForRowAt:)的代理中实施tableView方法。即。

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        // return desired height for your cell
        return 90.0
    }
    

答案 2 :(得分:1)

我的理论第二个标签被截断没有得到足够的宽度,并且可能是第二个标签中的行数是1.因此,尝试将行数设置为0并检查宽度和自动布局约束。