首先,这是可能的,这是个好主意吗?
我不希望UITableView
填满整个控制器,我想在我学习时控制这个视图的位置。我已经尝试过搜索显示这个的教程,但是我试图实现这个功能,因此我空手而归。
所以,我有一个子类UIView
的ChildView。此视图实现或符合必要的UITableView
协议,以便我可以将delegate
和dataSource
设置为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类中工作的代码。
答案 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