UITableView,不符合协议 - 如何声明几个?

时间:2015-08-27 12:02:51

标签: swift

我明白我需要在控制器中实现所需的方法并在视图和控制器之间建立关系..但

中的标识符“tableView”在哪里
 func tableView(mintabell: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return  items.count
}

来自,如果我想在同一视图上有几个tableview怎么办?如何单独申报?

4 个答案:

答案 0 :(得分:2)

这些是您需要为TableView声明的协议

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return createCellAndReturnItHere
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return numberOfCellsInSection
}

在一个ViewController中有多个tableview。如果每个tableview都有一个插座,那么你可以在协议函数中检查你需要哪个:

@IBOutlet weak var tableViewOne: UITableView!
@IBOutlet weak var tableViewTwo: UITableView!

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if tableView == self.tableViewOne {
        return createCellForTableViewOneAndReturnItHere
    } else {
        return createCellForTableViewOneAndReturnItHere
    }
}

答案 1 :(得分:1)

把它想象成一个盒子。订阅该协议的每个tableView在该框中抓取,留下其指纹并获取它所获得的内容。因此,如果在一个控制器中有多个tableView,则可以通过检查相等性来区分它们。

示例:

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let firstTableView = UITableView()
    let secondTableView = UITableView()

    viewDidLoad() {
        firstTableView.delegate = self
        secondTableView.delegate = self
        firstTableView.dataSource = self
        secondTableView.dataSource = self
    }

   // ... some othe methods...

    func tableView(mintabell: UITableView, numberOfRowsInSection section: Int) -> Int
    {
       if tableView == firstTableView {
           return 10
       }

       if tableView == secondTableView {
           return 20
       }

       return 0
    }
}

答案 2 :(得分:0)

代表由开发人员实现,并由iOS调用而不是开发人员。 tableView由iOS传递并指向特定的tableview。

如果您有多个具有相同委托的表视图,则可以将传递的tableview参数与您已实现的表视图进行比较,以确定哪一个。

或者,为tableView创建一个tableView委托和数据源。这将消除测试哪个tableView从代码中删除了大量条件逻辑。

答案 3 :(得分:0)

首先,您不一定总是必须为每个视图实现协议。只有当您拥有需要实现委托的视图时,您才必须使该协议符合该委托实现。

因此对于tableView,首先从对象库中拖动Controller中的UITableView,然后在Table View下拖动UITableViewCell。

enter image description here

现在转到ViewController.swift文件并添加

@IBOutlet var myFirstTableView: UITableView!

紧随其后。

class ViewController: UIViewController 

P.S:如果你有多个表,那么你可以在这里声明额外的表。就像 -

@IBOutlet var mySecondTableView: UITableView!

现在,我们假设您有一张桌子。现在,您需要添加协议列表。所以,只需添加UITableViewDelegate, UITableViewDataSource

class ViewController: UIViewController

以逗号附加。

添加这个应该会给你一个错误但是没关系。这是因为您尚未添加该UITableViewDatasource协议下列出的必需方法。

因此,只需添加所需的方法并相应地实现它。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("myCell") as! UITableViewCell

        cell.textLabel?.text = "test"

        return cell
    }

在这里,我说,我将有3个标识符为“myCell”的单元格,单元格的textLabel将有一个文本“test”。

现在,我们忘记了一个非常重要的步骤,那就是将细胞标识符分配给我们的TableView Cell。因此,转到故事板并选择TableView单元格并插入“myCell”作为单元格的标识符。

enter image description here

如果您有多个表,那么您将检查要加载数据的TableView。因此,您可以明确地为每个表分配一个唯一标记(您可以从故事板或代码中执行此操作),并且基于该标记,您将实现您的方法。假设你有3个表,分配的标签是1,2和3.所以,你可以做类似的事情,

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView.tag == 1{
            return 3
        }
        else if tableView.tag == 2{
            return 4
        }
        else{
            return 1
        }

    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
       if tableView.tag == 1{
         cell.textLabel?.text = "test1"
        }
       else  if tableView.tag == 2{
            cell.textLabel?.text = "test2"
        }
       else{
        cell.textLabel?.text = "test"
        }
        return cell
    }