如何将UITableView作为子视图添加到UIView?

时间:2018-04-12 06:07:14

标签: ios swift uitableview

首先,这是可能的,这是个好主意吗?

我不希望UITableView填满整个控制器,我想在我学习时控制这个视图的位置。我已经尝试过搜索显示这个的教程,但是我试图实现这个功能,因此我空手而归。

所以,我有一个子类UIView的ChildView。此视图实现或符合必要的UITableView协议,以便我可以将delegatedataSource设置为ChildView。但是,我似乎无法使其正常工作。有人可以帮我回答原因吗?这是我第一次使用UITableViews,所以我还没有太多经验。努力吧! :)

class ChildView: UIView
{
    let childTableView = UITableView()

    override init(frame: CGRect)
    {
        super.init(frame: frame)

        childTableView.register(ChildTableViewCell.self, forCellReuseIdentifier: "cellId")

        childTableView.delegate = self
        childTableView.dataSource = self

        childTableView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(childTableView)

        childTableView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
        childTableView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
        childTableView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
        childTableView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true

        setupLayout()
    }

    private func setupLayout()
    {
        self.layer.cornerRadius = 13
        self.backgroundColor = UIColor.white
        self.layer.borderWidth = 2
        self.layer.borderColor = UIColor.black.cgColor
    }

    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }
}

extension ChildView: UITableViewDataSource, UITableViewDelegate
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        return tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
    }
}


class ChildTableViewCell: UITableViewCell
{
    override init(style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupViews()
    }

    private func setupViews()
    {
        // Nothing yet. 
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

编辑1:包含我尝试使用UITableView填充的视图图像。

编辑2:我添加了使其在ChildView类中工作的代码。

2 个答案:

答案 0 :(得分:3)

从架构的角度来看,你不应该这样做。 视图应仅显示从外部某处获取的数据。它不应该充当数据源并试图获取它自己的数据。如果有人读取你的代码(在一年内成像),没有人会期望一个视图以你实现它的方式运行。

然后,您不会在任何地方显示表格视图。您必须将其作为子视图添加到self并设置其frame / autolayout约束以对调整大小等做出反应。

如果要将数据源代码与视图控制器分开,则应创建自己的类,该类实现UITableViewDataSource,实例化它,将其设置为表视图的数据源,然后就可以了。分离委托将起作用相同,但也许最好将它保留在视图控制器中,因为它充当其中所有视图之间的协调器。

答案 1 :(得分:0)

下面是示例代码已发布,你可以看看这个在不同视图中添加两个tableViews作为子视图,使用的父视图是一个ContainerView,但你导致相同的代码,只需在你的普通UIView中添加子视图

参考代码:

/// Class Obj
    private lazy var FirstObject: firstVC =
      {
        // Instantiate View Controller
        let viewController = self.storyboard?.instantiateViewController(withIdentifier: "firstVC") as! firstVC

        // Add View Controller as Child View Controller
        self.addChildViewController(viewController)
        return viewController
      }()


/// Adding it as Subview:
 private func add(asChildViewController viewController: UIViewController)
{
    // Configure Child View
    viewController.view.frame = CGRect(x: 0, y: 0, width: self.firstContainer.frame.size.width, height: self.firstContainer.frame.size.height)

    // Add Child View Controller
    addChildViewController(viewController)
    viewController.view.translatesAutoresizingMaskIntoConstraints = true

    // Add Child View as Subview
    firstContainer.addSubview(viewController.view)

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

GitHub Repo - https://github.com/RockinGarg/Container_Views.git

enter image description here