我有一个包含UITableViewCell的tableview,一切正常。但是我需要使用相同的UITableViewCell并将其显示在另一个ViewController中。这在iOS中是否可行?
来自Android背景,可以使用include标签轻松完成。如何在iOS中完成?
答案 0 :(得分:1)
如果您的意思是获取单元格实例并将其显示在另一个视图控制器中。简短的回答是肯定的,我们可以做到这一点。
UITableViewCell
本质上是一个UIView,因此没有理由不能将其添加为UITableView
之外的子视图。这绝对是一种矫枉过正,因为您可以通过设计自定义UIView
来获得相同的结果,您可以在其中显示UITableViewCell
中显示的数据。
这是如何做到这一点的一个非常基本的例子。 在这个例子中,我们使用数据获取所选单元格,然后在我们的新ViewController中显示我们创建它的副本。
import UIKit
class ViewController: UITableViewController {
private let myArray: [String] = ["First","Second","Third"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
tableView.dataSource = self
tableView.delegate = self
view.addSubview(tableView)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = OtherViewController()
vc.cell = tableView.cellForRow(at: indexPath)?.copyView()
// notice the .copyView() which makes the copy of that cell
navigationController?.pushViewController(vc, animated: true)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)
cell.textLabel!.text = "\(myArray[indexPath.row])"
return cell
}
}
class OtherViewController: UIViewController {
var cell: UITableViewCell! {
didSet {
// positioning the cell
cell.frame.origin.y = 100 // magic number - remove
view.addSubview(cell)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
//MARK: - UIView Extensions (to make the copy of the cell)
extension UIView {
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
答案 1 :(得分:-1)
是的,可以重复使用它。您可以在应用程序的任何位置使用自定义单元格