将相同的UITableView添加到不同的ViewControllers

时间:2018-02-14 10:31:12

标签: ios swift uitableview uikit

在我的应用程序中,我有相同的UI组件,应该在不同的ViewControllers中呈现。这个组件看起来像按钮列表,点击这个按钮的每个按钮应该推送VievController与一些参数 - 我决定使用UITableView。

假设我有ViewControllers:VC1,VC2,VC3应该显示这个UITableView。应在每个ViewController中显示的单元格数存储在名为按钮的数组中。

enter image description here

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....
      }
}
  • 声明此TableView的最佳方法是什么?我应该放在哪里 所有UITableView委派方法?
  • 我应该使用自定义XIB文件
  • 为此表创建单独的UIView子类
  • 这是创建一些协议canShowButtons的好地方吗?如果是这样 - 需要什么样的变量和方法。

2 个答案:

答案 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相同的技术) }}