在我的应用程序中,我有相同的UI组件,应该在不同的ViewControllers中呈现。这个组件看起来像按钮列表,点击这个按钮的每个按钮应该推送VievController与一些参数 - 我决定使用UITableView。
假设我有ViewControllers:VC1,VC2,VC3应该显示这个UITableView。应在每个ViewController中显示的单元格数存储在名为按钮的数组中。
struct Button {
var title : String
var param : Int
}
class VC1 : UIViewController {
var buttons = [Button]()
}
现在我在每个ViewController中创建这个tableView,比如
class VC1 : UIViewController, UITableViewDelegate, UITableViewDataSource {
var buttons = [Button]()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return buttons.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
....
return btnCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue....
}
}
答案 0 :(得分:1)
您可以将所有UI元素放在xib中,并在该xib类中处理tableView委托。如果要在xib和VC1之间进行通信,可以编写协议。或者第二种方法非常相似,您可以创建一个viewController(让它命名为UIelemntsVC
),它包含所有UI元素(tableView,按钮等)并将其加载到VC1,VC2,VC3等中。
在UIelementsVC
课程中,您可以像这样控制它的大小
self.view.frame = CGRect(x: 0, y: UIScreen.main.bounds.height, width: self.view.frame.width, height: self.view.frame.height*2)
如果你想使用自动布局,你应该在你的VC1中放置一个UIView并向其中添加UIelementsVC
子视图。
您可以像这样加载自定义ViewController:
let customVC = UIelementsVC()
customVC.customDelegate = self // Only if you have a custom protocol
customVC.numberOfButtons = 5 // You can edit vars in customVC like this
self.addChildViewController(customVC)
self.view.addSubview(customVC)
customVC(toParentViewController: self)
答案 1 :(得分:1)
只需将此代码称为VC1
即可:
class ButtonTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
...
// The better is not to make the data as UIButton s,
// but as data (Strings/Int/Structs/etc...), for testability
// and flexibility.
var dataSource = (() -> (UIButton))? {
didSet {
populateData()
}
}
func registerTheCellsFromXIB() {
// Here try to use register(_:forCellReuseIdentifier:)
}
override func viewDidLoad() {
super.viewDidLoad()
registerTheCellsFromXIB()
populateData()
}
func populateData() {
buttons = dataSource?()
}
...
}
然后你可以为所有人制作一个XIB。如果您希望单元格中的单元格与另一条单元格不同,则为不同类型的单元格创建多个XIB,然后放置一个可设置的闭包,可以注册TheCellsFromXIB()而不仅仅是一个普通函数(使用与{{1相同的技术) }}