快速填充表格视图

Posted

技术标签:

【中文标题】快速填充表格视图【英文标题】:Populate table view in swift 【发布时间】:2014-10-10 22:57:46 【问题描述】:

嗨,我想填充这个 tableview

我不使用静态表格视图,因为我出错了,我决定使用动态表格视图并禁用表格中的滚动。 表格视图仅用于信息:

  @IBOutlet var tableInfoQuake: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()
    navigationItem.title = quake.place


    tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?.text = quake.place
    tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?.text = "Mag: \(quake.mag)"
    tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Cordinate: (\(quake.longitude),\(quake.latitude))"
    tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Depth: \(quake.depth)"

但在表格视图中,我什么都没有看到。 我能怎么做?谢谢。

编辑:我这样做是为了修改每一行:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell 
    var cellIdentifier = "quakeInfo"
    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell
    if indexPath == NSIndexPath(forRow: 0, inSection: 0)
        cell.textLabel!.text = quake.place
        cell.detailTextLabel!.text = "Mag: \(quake.mag)"
    
    if indexPath == NSIndexPath(forRow: 1, inSection: 0)
      cell.textLabel!.text = "Cordinate: (\(quake.longitude),\(quake.latitude))"
        cell.detailTextLabel!.text = "Depth: \(quake.depth)"
    

    return cell


【问题讨论】:

【参考方案1】:

哦,TableViews...

所以,您想要动态填充一个表格视图。嗯……给你我的朋友:


第 1 步:实现数据源

好的....所以你知道什么是协议吗?好吧,如果你不...BAM, now you do(视频中不是我)。 DataSource 是 UITableView 将调用以检索它需要显示的数据。具体来说,有问题的DataSource是UITableViewDataSource。

所以...

    // change top to...

    class MyViewController:UIViewController, UITableViewDataSource

这使得 UITableViewDataSource 成为 ViewController 的要求。接下来,您需要在 UITableView 上设置数据源。所以....

    override func viewDidLoad() 
        super.viewDidLoad()
        navigationItem.title = quake.place

        tableInfoQuake.datasource = self     
    

假设您现在要向表格中添加 7 个单元格,并且所有 7 个单元格都会说“Hello Man”。对于这个例子,我将使用最糟糕但最简单的方法。如果你想让我更深入,请在下面评论,我会做得更好。

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 7
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell 
        let cell = UITableViewCell()
        let label = UILabel(CGRect(x:0, y:0, width:200, height:50))
        label.text = "Hello Man"
        cell.addSubview(label)
        return cell
    

这就是第一步。我们已经告诉表格 ViewController 有它正在寻找的数据,并且我们已经返回了数据供它使用。


第 2 步:实现委托

很像第 1 步,这一步从在顶部添加一些东西开始......

    // change top to...

    class MyViewController:UIViewController, UITableViewDataSource, UITableViewDelegate

然后,再次像顶部一样,我们将编辑 viewDidLoad() 函数...

    override func viewDidLoad() 
        super.viewDidLoad()
        navigationItem.title = quake.place

        tableInfoQuake.datasource = self
        tableInfoQuake.delegate = self
    

现在我们必须实现指定每个单元格高度的委托方法。

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
        return 50
    

我们现在已经将代理添加到表格中,并实现了告诉 UITableView 每个单元格的高度的方法。


让我们把它们放在一起

    class MyViewController:UIViewController, UITableViewDataSource, UITableViewDelegate 

        @IBOutlet var tableInfoQuake: UITableView!

        override func viewDidLoad() 
            super.viewDidLoad()

            tableInfoQuake.datasource = self
            tableInfoQuake.delegate = self
        


        // UITableViewDataSource Functions

        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
            return 7
        

        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell 
            let cell = UITableViewCell()
            let label = UILabel(CGRect(x:0, y:0, width:200, height:50))
            label.text = "Hello Man"
            cell.addSubview(label)
            return cell
        


        // UITableViewDelegate Functions

        func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
            return 50
                
    

祝你好运。

ZR

【讨论】:

好的,但是我如何选择一行并处理它,因为两行是不同的。当我实现 func cellForRowAtIndexPath 时,我为每个单元格实现相同的结构,而不是我希望为每一行设置不同的结构。像这样:tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?。 text = quake.place 和这个:tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Cordinate: ((quake.longitude),(quake.latitude))" 在 cellForRowAtIndexPath 中,您将获得 indexPath 参数,该参数告诉您表格正在请求哪个单元格。要处理特定的单元格——例如第二个单元格——你可以这样做 if(indexPath.row == 1) //setup code 非常非常有帮助。请注意,您可能需要将datasource 中的大小写更改为dataSource 对于 Swift 3,在创建 UILabel 时使用frame: CGRect(x:0, y:0, width:200, height:50)【参考方案2】:

情节提要中的单元格是原型单元格。这意味着它们实际上不在表格视图中,但可以用作模板。

为了填充表格视图,您需要:

    在情节提要中,通过将“数据源”连接从表视图的连接菜单拖动到视图控制器,将视图控制器设置为表视图的数据源。 使您的视图控制器符合 UITableViewDataSource 协议。 在您的视图控制器中实现以下方法: func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

【讨论】:

使用这种方式你将如何引用tableview来执行刷新数据?还需要 IBOutlet 对吗? 是的,您需要 IBOutlet 来引用 tableview。

以上是关于快速填充表格视图的主要内容,如果未能解决你的问题,请参考以下文章

除非快速选择所有单元格,否则限制表格视图

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

快速制作模型(原型)视图 xcode

如何填充表格视图,而不是表格视图控制器?

当我尝试快速加载我的表格视图时,为啥会出现 EXC_BAD_INSTRUCTION 错误?

NSMutableArray 为表格视图填充太晚