在 UICollectionViewCell 中设置 UILabel
Posted
技术标签:
【中文标题】在 UICollectionViewCell 中设置 UILabel【英文标题】:Setting a UILabel inside a UICollectionViewCell 【发布时间】:2016-05-08 17:08:04 【问题描述】:所以问题是我在 TableView 内的 CollectionView 中有 4 个 UICollectionViewCells。 (我将 TableViewController 设置为 CollectionView 的 DataSource 和 Delegate)。
现在,我在 CKRecord 中存储了一个包含 4 个元素的字符串数组。如何在 4 个单元格内设置标签,以便它们显示数组的每个字符串?
它是这样的:
func collectionView(collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int
return 4
func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CvCell
let poll = polls[indexPath.row] // polls is a [CKRecord]()
let labelContent = poll["4strings"] as? [String]
cell.cellLabel.titleLabel?.text = labelContent
return cell
现在显然,这是行不通的,因为我基本上将每个单元格的标签设置为数组本身。如何编写一个遍历每个 CvCell 标签的 for 循环,或者更确切地说如何指定例如标签第三个单元格将其设置为 labelContent[2] 的值?
更新:
完全忘了说,云端的数据结构基本上是这样的:
array1 = [1a, 1b, 1c, 1d]
array2 = [2a, 3b, 2c, 2d]
array3 = [3a, 2b, 3c, 3d]
array4 = [4a, 4b, 4c, 4d]
如果我尝试执行@user3353890 建议的操作,它会为我的表格视图提供以下结果:
tableview1cell - collectionview1 : [1a, 2b, 3c, 4d] -> these are the collectionviewcell labels
tableview2cell - collectionview2 : [1a, 2b, 3c, 4d]
tableview3cell - collectionview3 : [1a, 2b, 3c, 4d]
tableview4cell - collectionview4 : [1a, 2b, 3c, 4d]
但是我想要的是:
tableview1cell - collectionview1 : [1a, 1b, 1c, 1d]
tableview2cell - collectionview2 : [2a, 2b, 2c, 2d]
tableview3cell - collectionview3 : [3a, 3b, 3c, 3d]
tableview4cell - collectionview4 : [4a, 4b, 4c, 4d]
很抱歉,我很难解释这一点,但我希望有人能理解我想要做的事情吗?
【问题讨论】:
labelContent 应该是一个字符串数组吗?您不能将 label.text 设置为数组。如果要在一个标签上显示数组中的任何字符串,请使用 for 循环遍历数组并将每个字符串添加到前一个字符串中,以便在字符串上创建以显示在标签中。 是的,我知道这个 obv。不起作用,正如我在上一段中描述的那样,我想将数组的第一个字符串设置为第一个 collectionview 单元格的标签,将数组的第二个字符串设置为第二个 collectionview 单元格的标签,依此类推.. 但是,我不知道如何在这里使用 for 循环,因为我只返回一个单元格? 抱歉,我想我明白你现在想做什么了。我将在下面发布一个答案,我们可以解决这个问题。 在 tableView 中嵌套 collectionView 是一种不好的做法,因为这会增加单元格出列的额外开销,并使您的代码比应有的复杂。只需使用 collectionView 即可获得相同的结果。 【参考方案1】:首先,您不会返回一个单元格。您最终将返回 4 个单元格,因为您在 numberOfItemsInSection 方法中规定了每个部分中需要 4 个项目。
func collectionView(collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int
return 4
cellForItemAtIndexPath 协调您希望如何显示每个单元格。因为您声明一个部分中有 4 个项目,所以此方法将被调用 4 次,每次调用它作为该部分中的一个项目时返回 1 个单元格。
func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CvCell
let poll = polls[collectionView.tag] // polls is a [CKRecord]()
let labelContent = poll["4strings"] as? [String]
// This should give you the string that you want.
let myString = labelContent[indexPath.row]
// Display the string in the label.
cell.cellLabel.titleLabel?.text = myString
return cell
设置 labelContent 数组后,通过将 indexPath.row 传递到数组中来获取每个索引处的 myString。因此,对于第一个单元格(0 索引),它会为您提供数组中的第一个字符串(0 索引)。
编辑
创建投票时,使用 indexPath.section 以在显示数据时保持所有数组的正确顺序。
let poll = polls[collectionView.tag]
编辑 2
在你的tableView cellForRowAtIndexPath 方法中,当你创建一个单元格时,将单元格的collectionView.tag设置为indexPath.section
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomCell
cell.collectionView.delegate = self
cell.collectionView.dataSource = self
cell.collectionView.tag = indexPath.section
return cell
然后,当您将 collectionView 出列时,您可以通过调用 collectionView.tag(如上所示)来访问正确的数组,以获取 tableViewCell 的 indexPath。
【讨论】:
感谢您的回答!是的,对不起,我的意思是我只返回 1 个单元格的“蓝图”4 次。另外,我完全忘了提到我得到了 4 个 CKRecords(因此我向 polls[indexpath.row] 声明了 poll),并且这 4 个 CKRecords 中的每一个都有 1 个 4 个字符串的数组。我会更新我的帖子,让你有更好的见解 不用担心,感谢您提供更多信息!给我一点时间,我会尽力想出一个解决方案 @user3545063 我已经更新了上面的解决方案。我相信这现在应该可以工作了。 哦,对了!它现在几乎可以按预期工作,但是它只以正确的顺序为所有 4 个 uitableviewcells 显示 1 个数组(而不是数组 1 - uitableviewcell 1、数组 2- uitableviewcell 2 等)。 好的,我知道为什么。这是因为我们使用的是 CollectionView 的部分,它始终为 0,而不是 TableView 的部分。所以我们需要获取TableView的当前部分【参考方案2】:一个更好的解决方案,这样您就不必在 tableView 中嵌套 collectionView:
这将为您提供所需的部分数量。 “投票”数组中的每个数组都有一个部分:
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
return polls.count
这将获取每个对应部分的子数组,并允许该 collectionView 部分中的项目数与数组中的项目数相对应:
func collectionView(collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int
let poll = polls[section] as? [String]
return poll.count
在此处显示您的 collectionView 单元格:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CvCell
let poll = polls[indexPath.section] // polls is a [CKRecord]()
let labelContent = poll["4strings"] as? [String]
// This should give you the string that you want.
let myString = labelContent[indexPath.row]
cell.cellLabel.titleLabel?.text = myString
return cell
【讨论】:
我明天会调查一下,谢谢!不过,这将如何影响我的故事板布局?我是否只需要删除 tableview 并用集合视图替换它? 是的,只需使用 collectionview 或 collectionview 控制器。如果您使用前者,请不要忘记附加您的委托和数据源。你的故事板会简单得多。您不会尝试将 collectionviews 嵌套在 tableviewcells 中。如果你保持简单,它也更容易维护和扩展。以上是关于在 UICollectionViewCell 中设置 UILabel的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UICollectionViewCell 中设置 UILabel
将字符串传递给自定义类时,在 UICollectionViewCell 中设置标签文本不起作用
UICollectionViewCell 宽度大于我在 sizeForItemAt 中设置的宽度