表格视图显示为空而不符合我的自定义单元格

Posted

技术标签:

【中文标题】表格视图显示为空而不符合我的自定义单元格【英文标题】:Table view showing up empty instead of conforming to my custom cell 【发布时间】:2016-12-05 20:23:15 【问题描述】:

我有一个带有自定义单元格的表格视图,其中包含一组项目。我初始化了一个空数组和一些类似的数据

    var venues = [String]()
    var images = [String]()
    var nycVenues = ["Webster Hall", "Output", "The Woods"]
    var nycImages = ["Webster", "Output", "Woods"]

然后根据页面的标题是什么,该数组将填充相应的数据。这是我在 cellForRowAt indexPath 中的代码

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! VenueCell


    if (self.navigationItem.title == "NYC Venues") 
        nycVenues = venues      //fill the empty venue array with nycVenues
        nycImages = images    //fill the empty images array with nycImages
        cell.textLabel?.text = venues[indexPath.row]
        DispatchQueue.main.async 
            cell.venueImageView.image = UIImage(named: images[indexPath.row])!
        
    
    //.....other venues set up the same way
    return cell

节中的行数

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

设置单元格的高度

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return 72

这是我的自定义单元格

class VenueCell: UITableViewCell 

override func layoutSubviews() 
    super.layoutSubviews()
    textLabel?.frame = CGRect(x: 100, y: textLabel!.frame.origin.y - 2, width: textLabel!.frame.width, height: textLabel!.frame.height)
    detailTextLabel?.frame = CGRect(x: 64, y: detailTextLabel!.frame.origin.y + 2, width: detailTextLabel!.frame.width, height: detailTextLabel!.frame.height)



let venueImageView: UIImageView = 

    let imageView = UIImageView()
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.layer.masksToBounds = true
    imageView.contentMode = .scaleAspectFill
    return imageView

()

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)

    addSubview(venueImageView)
    venueImageView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8).isActive = true
    venueImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    venueImageView.widthAnchor.constraint(equalToConstant: 48).isActive = true
    venueImageView.heightAnchor.constraint(equalToConstant: 48).isActive = true




required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")




问题是当表格视图出现时,它只显示一个空的默认表格视图(不符合我的自定义单元格,并且没有任何项目)。有人知道我在哪里遗漏了什么吗?

【问题讨论】:

nycVenues = venues 行将填充的数组替换为空数组,而不是相反。 Rmaddy 是对的。这是一个很好的例子,说明为什么你应该使用let 而不是var 来处理不会/不应该改变的数据。如果你这样做了,那么编译器会给你一个错误,你就会避免一个微不足道的错误。 cellForRowAt 也是放置该代码的错误位置。 Rmaddy,谢谢我更改了它,但问题仍然存在。应该说,如果我在numberOfRows中返回3而不是venues.count,一切正常 【参考方案1】:

更新

正如下面 cmets 中提到的paulw11,venuesimages 数组的分配应该在之前 tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) 被调用。因此,在viewDidLoad 中进行分配应该可以解决它。

原创

您的问题出在tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell。检查if 语句并更改这两行

nycVenues = venues      //fill the empty venue array with nycVenues
nycImages = images    //fill the empty images array with nycImages

venues = nycVenues      //fill the empty venue array with nycVenues
images = nycImages    //fill the empty images array with nycImages

【讨论】:

这很尴尬.. 但是在进行更改后,问题仍然存在,只是显示一个空的默认表格视图。 另外,如果我更改 numberOfRows 以返回一个常量,比如 return 3,那么一切都会完美显示。但是当我返回venues.count 时,我得到了没有自定义单元格的空表视图。 您是否更改了分配数组的位置?您需要在viewDidLoad 中进行操作。通过在cellForRow 中执行此操作,计数为 0,因此永远不会调用 cellfrorRow。当您返回一个常量计数时,它会被调用并分配数组

以上是关于表格视图显示为空而不符合我的自定义单元格的主要内容,如果未能解决你的问题,请参考以下文章

我的自定义单元格未显示在我的表格视图中

显示零的自定义表格单元格

为啥我的自定义表格单元格中的标签在单击行之前无法显示

如何从表格视图的自定义单元格内的文本字段中获取值(标签)以发布到 URL [重复]

如何从表格视图的自定义单元格内的 TextField 获取值(标签)以发布到 te URL

UITableview中的按钮修改当前单元格自定义