SWIFT:在performSegueWithIdentifier之后未加载原型单元格

时间:2015-11-06 19:55:05

标签: ios swift uitableview ios9 xcode7

我有一个ViewController使用此函数调用(单击按钮)另一个View

@IBAction func btnSeeContact(sender: AnyObject) {
        self.performSegueWithIdentifier("segueSeeContact", sender: self)
    }

我的原型单元是"链接"到我创建的名为ContactsTableViewCell的自定义视图控制器,它实现了:

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

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

        cell.txtName.text = "test"
        cell.txtPhone.text = "1234567890"

        return cell

    }

当我运行项目时,按钮调用表,但是没有Cell,我在这些tableView函数上放置了一个断点,但是没有到达它们。

我在这里想到的是,这些函数永远不会被调用?

enter image description here

2 个答案:

答案 0 :(得分:2)

我正在添加一个新答案,因为我之前的答案已经过投票,因此我不想对其进行大量修改,而且仍然是解决问题的有效方式。

问题是您的自定义类很困惑。在屏幕截图中,您可以看到Table View Controller未设置为自定义类,只是说A。这是需要获得UITableViewController类的自定义实现的对象。

相反,您似乎将单元格的类设置为自定义类,并在那里实现委托方法。您仍然需要表视图单元格的自定义类,但它应该是Table View Controller的自定义类。

所以你的细胞类应该是这样的:

UITableViewCell

您将获得此单元格的实例以在cellForIndexPath中进行配置。 因此,您的Table视图控制器类应设置为如下所示的类。你想要实现所有委托方法的YourTableViewController。

注意:如果您使用从故事板中拖出的UITableViewController,它将已经拥有tableView,并且已经为您配置了委托/数据源。您还会注意到您正在覆盖委托方法,因为UITableViewController类具有这些方法的默认实现。如果您只是使用普通视图控制器,请参阅我之前的答案,了解有关如何进行设置的详细信息。

import UIKit
class YourCustomTableViewCell: UITableViewCell {
  @IBOutlet weak var yourLabel1: UILabel!
  @IBOutlet weak var yourLabel2: UILabel!
}

答案 1 :(得分:1)

正如其他人所评论的,你真的需要提供更多的背景。

以下是可能出错的一些事情,提供更多背景会证实或否认这一猜测。

首先,您不要显示numberOfSectionsInTableView方法。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
          return 0
  }

我认为您需要提供0以外的值

其次,由于我不确定在我确定你打算成为UITableViewDelegate方法函数调用的前面override,这意味着你的视图控制器不是UITableViewController。这让我想知道你是否将这个视图控制器定义为符合UITableViewDelegate协议,并且如果你将表视图插座委托设置为self。 (或者甚至将UITableView连接到插座)

如果使用普通的UIViewController来托管表视图,则需要执行以下操作:

  1. 将UITableView连接到视图控制器中的插座
  2. 将视图控制器声明为符合UITableViewDeleagate(可能是UITableViewDataSource)协议
  3. 将表视图的outlet委托(也许是dataSource)属性设置为self(实现协议的视图控制器)
  4. 实施所需方法
  5. 这样的事情:

    class MyTableViewController: UIViewController, UITableViewDelegate {
    
      @IBOutlet weak var tableView: UITableView!
    
      override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
      }
    
      func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
      }
    
      func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 1
      }
    
      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("your PrototypeCell", forIndexPath: indexPath)
        // Configure the cell...
        return cell
      }
    }