如何在另一个ViewController中包含UITableViewCell

时间:2018-03-12 18:25:34

标签: ios swift uitableview

我有一个包含UITableViewCell的tableview,一切正常。但是我需要使用相同的UITableViewCell并将其显示在另一个ViewController中。这在iOS中是否可行?

来自Android背景,可以使用include标签轻松完成。如何在iOS中完成?

2 个答案:

答案 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)

是的,可以重复使用它。您可以在应用程序的任何位置使用自定义单元格