以编程方式生成不同的静态UITableviews

时间:2015-06-21 17:04:52

标签: ios swift uitableview programmatically-created

我刚刚加入StackOverflow,我正在努力应对iPhone应用程序的编程要求,我正在快速开发。我有一个不同计算器的tableview列表,当我点击一个项目然后对该工具进行详细计算时,我想转到另一个UITableView

我可能在第一个表(> 20)中有很多工具,所以我不想使用故事板来绘制每个新的UITableView静态表,每个表都有不同的segue之一。

我想知道是否有人可以就如何在单击项目时使用静态单元格以编程方式编写新UITableViewController的演示文稿时给出一些建议。我不想使用故事板,所以我需要使用代码来管理演示文稿以及使用静态单元格生成下一个UITableViewController

我已经能够以编程方式使用自定义类编程静态tableview并链接到storyboard UITableViewController项,但我希望以编程方式完成所有这些并一起剪切故事板。

非常感谢您提供的任何建议。

感谢。

1 个答案:

答案 0 :(得分:0)

A UITableViewController抽象了一些东西。看起来你想要做的就是将事情分开并进行更细粒度的控制。

你可以很容易地做到这一点。你需要做3件事:

  • UITableView
  • UITableViewDataSource
  • UITableViewDelegate

UITableViewController将这些全部放在一起。我们必须自己创造它们。

为此,我们制作了一个视图控制器,并继承了UITableViewDataSourceUITableViewDelegate

class Example: UIViewController {


}

// MARK - UITableViewDataSource
extension Example: UITableViewDataSource {
    // We need to implement some methods here
}

// MARK - UITableViewDelegate
extension Example: UITableViewDelegate {

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // Handle the user clicking an item here
    }

}

还有三件事要做:

  • 创建并显示表格
  • 获取要在表格中显示的数据
  • 实施委托方法

创建表

您应该决定是否要以编程方式完全创建UITableView,或者让Interface Builder在.xib中为您创建一个,并且您只需通过IBOutlet将其链接起来。

假设您想要做前者,您可以执行以下操作:

var table: UITableView?

override func viewDidLoad() {
    super.viewDidLoad()
    table = UITableView(frame: view.bounds)
    view.addSubview(table!)
    table?.delegate = self
    table?.dataSource = self
}

获取数据

从上一个视图控制器推送此视图控制器时,请务必使用您的数据在此视图控制器上设置变量。假设你有一个数组,它就像这样简单:

exampleViewController.myData = someArray;
navigationController?.pushViewController(exampleViewController, animated: true)

(务必在View Controller中创建myData变量以获取此信息)

实施委托方法

现在我们可以实现委托方法来显示数据。您可能已经熟悉了这一点,但为了完整起见:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myData.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // You should really use dequeueReusableCellWithIdentifier here.
    var cell = UITableViewCell()
    cell.textLabel!.text = myData[indexPath.row]
    return cell
}