iOS - 如何在不同的 UITableViewCell 中重用 UIView

Posted

技术标签:

【中文标题】iOS - 如何在不同的 UITableViewCell 中重用 UIView【英文标题】:iOS - How to reusue a UIView in different UITableViewCell 【发布时间】:2017-01-16 12:06:14 【问题描述】:

我正在处理UItableViewController,其中可以有五种类型的UITableViewCell。每种细胞的主要部分是共同的。我可以为所有五个单元格实现这些部分,但我想制作一个可重用的视图并在所有单元格中使用它。设计和实施此要求的最佳方式是什么?

例如,在 Facebook 提要中,可以有多种类型的帖子。但是每个帖子底部的喜欢/评论/分享面板是相同的。如何实现这些不同类型的单元格,将喜欢/评论/分享面板保存在 Xcode 上的一个位置。

提前致谢

【问题讨论】:

子类UITableViewCell? 你能在答案部分解释一下吗?谢谢@CodeDifferent 创建一个 UIView(Xib 或以编程方式对您来说很容易)。我建议创建一个返回 UIView 的函数,该函数对于每个单元格都是通用的。当你打电话给 "cellForRowAt" 时。将该 UIview 添加为 ContentView 的子视图。 【参考方案1】:

使用故事板

您可以做的是将包含所有常见功能的UIView 子类化。

例如:

class ViewWithBorder : UIView

   //any view that you apply this class on in storyboard will
   //have the following properties assigned to it
    override func awakeFromNib() 

        super.awakeFromNib()

        self.layer.borderColor = UIColor.blue.cgColor

        self.layer.borderWidth = 1.0

       //programmatically add buttons and whatever you desire to this view here
    

现在在您的故事板中,您创建了一个原型单元格,只需在单元格中添加一个UIView 并将其类设置为viewWithBorder。在awakeFromNib 中分配给它的所有属性都将在运行时添加到该视图中。

注意:如果您以编程方式创建视图而不使用情节提要,则必须覆盖 initWithCoder

为新的UIView 创建xib,这将在所有视图中通用,如果它在您的cellForRow 中为零,则只需将其添加到您的单元格中。

【讨论】:

我想在情节提要中创建公共视图,然后在公共视图中添加/导出按钮的操作/目标。是否可以不以编程方式添加它们?还有如何/在哪里与单元格的不同部分合并? 我不认为你可以直接在故事板中做,但你可以看看创建和使用 xibs,这里有很多关于相同的问题。 Xib 本质上是可以放入故事板的项目的单个组件。我个人只是以编程方式添加它们。使用我刚刚给出的示例或使用 xib 的方法添加到单元格的不相同部分?【参考方案2】:

假设您要实现一种左侧带有彩色点的单元格:

首先,定义您的自定义单元类:

import UIKit

@IBDesignable class MyTableViewCell : UITableViewCell 
    @IBInspectable var dotColor: UIColor = UIColor.gray

    override func draw(_ rect: CGRect) 
        super.draw(rect)

        let radius = rect.height / 8
        let center = CGPoint(x: 20, y: rect.midY)

        let context = UIGraphicsGetCurrentContext()!
        context.addArc(center: center, radius: radius, startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
        context.setFillColor(dotColor.cgColor)
        context.fillPath()
    

现在转到 Interface Builder 并通过将它们的类更改为 MyTableViewCell 来设计您的原型单元:

【讨论】:

我的问题是针对使用常见的复杂 uiview,带有按钮、动作/目标等。我该如何实现它? 将这些按钮添加到MyTableViewCell 并像往常一样连接操作/目标。您需要为我提供更多细节,以便在此之外为您提供帮助【参考方案3】:

为了重用单元格的一部分,我建议创建一个单元格,您将在其中添加单元格之间共有的每个部分,然后像这样将该单元格子类到您的主单元格中

class MyCommonCell: UITableViewCell 

//declare variables init views and other things your tableview cells will have in common

override init()  //do your initialisation here 
   



class MyCell: MyCommonCell  
//add here the different items from the cell following the same architecture as above

编辑以回答评论:我的问题是针对使用常见的复杂 uiview、按钮、操作/目标等。我该如何实现它?

为了做到这一点,你需要创建一个扩展 UIView 的类

class MyExampleClass: UIView 

然后创建一个包含视图的新 .xib 文件,然后您可以将此视图链接到新的 MyExampleClass 并向其添加出口

【讨论】:

这将是您案例的最佳实践【参考方案4】:

我认为对您的问题的回答应该取决于要求。

如果你想在 FB 中实现面板

例如,在 Facebook 提要中,可以有多种类型的帖子。但是每个帖子底部的喜欢/评论/分享面板是相同的。如何实现这些不同类型的单元格,将喜欢/评论/分享面板保存在 Xcode 上的一个位置。

在我看来,您应该使用面板创建小单元。不要创建“大细胞”。单元应尽可能小,重用会比大单元更快。它也将是最简单的然后是带有子类的“大单元”。

所以你会有这样的感觉

VideoPost cell
like/comment/share panel cell
ImagePost cell
like/comment/share panel cell
AudioPost cell
like/comment/share panel cell
....

而且您将来可以轻松地重复使用它。希望对你有帮助。

【讨论】:

问题不在于大小单元。它是关于如何在单个 xib 中使用相同的部分。【参考方案5】:

首先,创建一个空的 xib 并将 UIView 组件添加到其中。创建一个类(类型:UIView Let Suppose "CommonView")使用 xib 添加该类并执行所需的连接、Outlet 和 Action。

Add
var uiview:CommonView?

GOTO :  heightForRowAt
Set height of cell based on needed calculation.
return height 

Then Goto 
cellForRowAt
 var cell: TableViewCell! = tableView.dequeueReusableCell.............
// Code for your Xib

 self.uiview?.frame = CGRect(x: cell.dynamicLabel.frame.origin.x  , y: cell.dynamicLabel.frame.origin.y + size + (self.uiview?.frame.size.height)! ,width: (self.uiview?.frame.width)!, height: (self.uiview?.frame.height)!)


self.uiview?.uielementAddedToViewXib///////


cell.contentView.addSubview(self.uiview!)


return cell

请查看Code here 请让我知道它的工作与否。

【讨论】:

我不是反对者。我会检查代码n让你知道。 好的,实际上我为这篇文章编写了代码,有人在没有检查的情况下投了反对票。没问题,它对你有用吗?

以上是关于iOS - 如何在不同的 UITableViewCell 中重用 UIView的主要内容,如果未能解决你的问题,请参考以下文章

带有静态单元格的 iOS cellForRowAtIndexPath

UICollectionView(I)

如何快速编写[UITableViewCell 类]?

将 UIView 显示为弧线

如何在 Swift 中隐藏/删除空表视图行?

Swift - 使用 UITableViewController 创建子菜单