【问题标题】:String is validated as empty when it's not字符串不是空时被验证为空
【发布时间】:2018-10-06 11:08:50
【问题描述】:

我有一个 CollectionView,用于在我的社交应用程序中显示我的提要。我现在正在尝试将新帖子添加到提要中,效果很好。但是,有时,当添加的单元格占据整个屏幕高度时,不会显示附加到帖子的注释。这是因为我有一个验证来检查注释是否为空,如果是,则删除注释文本视图的子视图并更改约束。看一下图片以了解我的意思(对质量差表示歉意,我被限制为 2 MB):

这是我的 cellForItemAt 方法出错的地方。我有两个数组:posts 和 userInfo,它们都正确填充了数据,因为如果我打印 cellForItemAt 中的所有数据,它都会按预期显示。

if let postNote = posts[indexPath.item].postNote {
    if(postNote.isEmpty) {
        socialCell.noteTextView.removeFromSuperview()
        socialCell.postDetailsView.bottomAnchor.constraint(equalTo: socialCell.noteTextView.bottomAnchor).isActive = false
        socialCell.postDetailsView.bottomAnchor.constraint(equalTo: socialCell.postName.bottomAnchor).isActive = true
    }
}

我在这里要做的是决定是否应将约束设置为注释或帖子的名称,具体取决于是否有注释。如果我注释掉这段代码,约束就不是应该的(显然),但所有的注释都会显示出来。所以我确信可以在这里找到问题:我的笔记字符串被视为空,而事实并非如此。打印出数组或 print(postNote) 返回正确的值。

这里发生了什么,我应该如何解决?

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell


    【解决方案1】:

    细胞被重复使用。当以前有空笔记的单元格被重新用于具有非空笔记的帖子时,您需要确保正确设置了约束,否则笔记仍将被隐藏。

    此外,您不希望在重复使用单元格时不断添加约束。您应该一次在自定义单元格类中添加这两个约束,然后根据需要将它们设置为活动/非活动。

    最后,不要删除noteTextView,同样,当单元格被重复使用时,它在有注释的情况下将不可用。您应该简单地将其设置为 isHidden = true 或使用约束隐藏它

    类似:

    socialCell.noteTextView.isHidden = true
    socialCell.hideNoteConstraint.isActive = true
    socialCell.showNoteConstraint.isActive = false
    
    if let postNote = posts[indexPath.item].postNote, !postNote.isEmpty {
        socialCell.noteTextView.isHidden = true
        socialCell.hideNoteConstraint.isActive = false
        socialCell.showNoteConstraint.isActive = true
    } 
    

    【讨论】:

    • 嗨,保罗,非常感谢您的意见。我相信这是解决方案,因为您所说的一切都很有意义。不过有一个小问题:我应该如何在我的自定义单元格类 (socialCell) 中设置 hideNoteConstraint 和 showNoteConstraint?我是否也应该将其声明为全局变量,以便可以在自定义类之外使用它?干杯!
    • 不是全局的,而是单元类的属性
    • 所以我将 showNoteConstraint 和 hideNoteConstraint 设置为 NSLayoutConstraint 类型的属性。然后,在 super.init(frame: frame) 处,我收到错误 Property ‘self.showNoteConstraint’ not initialized at super.init call。如果我尝试调用它们,所以 super.init(frame: frame, showNoteConstraint, hideNoteConstraint),我会收到错误 Cannot invole 'UICollectionViewCell.init' with an argument list of type '(frame: CGRect, NSLayoutConstraint, NSLayoutConstraint)'。
    • MKe 然后隐式解包选项并在awakeFromNib 中创建它们,或者如果您使用情节提要,则在界面构建器中创建它们并使其成为 IBOutlets 并像任何其他插座一样连接它们。
    • 因为你的回答,我试图找到一个解决方案,我不会在 cellForItemAt 方法中使用约束 - 因为我读到这最好不要在那里完成。相反,我通过使用 NSLayoutConstraint WithVisualFormat 找到了一个解决方案,我在三个不同的视图中对帖子项进行了分组:postDetails(包含 userName、postName 和 postNote)、postStats(包含每个帖子底部的灰色元素)和分隔线.不确定这是否是最好的解决方案,但它现在有效,所以谢谢你把我送到正确的方向!
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多