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的主要内容,如果未能解决你的问题,请参考以下文章