- [UIViewController tableView:numberOfRowsInSection:]:发送到实例的无法识别的选择器

时间:2016-01-09 10:10:37

标签: ios swift uiviewcontroller selector

我是Swift的新手,因为我在几个月前开始研究它。这个错误我有一个疼痛的问题。

-[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance XXX

以下是我目前收集和实施的可能修复程序列表。

  1. 我已将自定义类更改为CheckboxQuestion类而不是UIViewController类。
  2. Custom Class

    1. 我已将tableview连接到数据源并委托。

    2. 我已经考虑了所有松散的引用网点。

    3. 我为每个原型单元命名了可重复使用的标识符出口。

    4. prototype cell 1

      在所有这些之后,我仍然得到上述错误。

      此行的appdelegate类中发生了异常错误的断点

      class AppDelegate: UIResponder, UIApplicationDelegate {
      

      我还缺少其他什么吗?

      以下是CheckboxQuestion类代码的代码

      import UIKit
      
      var checkboxCellInfo = ["Field 1", "Field 2"]
      
      class CheckboxQuestion: UIViewController {
      
      @IBOutlet weak var tableView: UITableView!
      
      //1. determine number of rows of cells to show data
      func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  
          return checkboxCellInfo.count + 1
      }
      
      //2. inputs info into each cell from array 'cellInfo'
      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell? {
      
          if indexPath.row <= checkboxCellInfo.count - 1 {
      
              let cell:CheckboxQuestionCellConnect = self.tableView.dequeueReusableCellWithIdentifier("CheckboxNumber") as! CheckboxQuestionCellConnect
      
              return cell 
      
           } else {
      
              let cell:CheckboxQuestionCellConnect = self.tableView.dequeueReusableCellWithIdentifier("CheckboxAdd") as! CheckboxQuestionCellConnect
      
              return cell
      
          }  
      }
      
      //3. determines height of each cell
      func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
          return 60
      }
      
      override func viewDidLoad() {
          super.viewDidLoad()
      }
      
      override func didReceiveMemoryWarning() {
          super.didReceiveMemoryWarning()
          // Dispose of any resources that can be recreated.
      }
      }
      

9 个答案:

答案 0 :(得分:5)

请确保您已从代码中删除了插座,但未从故事板中删除。只需从storyboard .delete outlet右键单击tableview并重新连接。可能您已为同一个tableview添加了两个插座。

答案 1 :(得分:3)

您正在实施UITableViewDelegate / UITableViewDataSource方法,但看起来您的类似乎不符合其中任何一种方法。由于您继承自UIViewController,因此您需要添加这些协议,并将表格视图的delegatedataSource设置为self:< / p>

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
}

如果视图控制器只显示一个视图控制器,你应该考虑使用UITableViewController而不是UIViewController,那么上面的内容并不适用 - 你可以免费获得{ {1}}。但是我不能从代码中判断出是这种情况。

答案 2 :(得分:2)

我认为在这种情况下,您可能忘记将tableview委托和数据源分配给self。

self.tableView.dataSource = self

self.tableView.delegate = self

答案 3 :(得分:2)

请确保您已添加以下内容。

class ViewController: UIViewController 
      ,UITableViewDataSource,UITableViewDelegate{

并且还将delegatedatasource连接到了stoaryboard中的tableview

答案 4 :(得分:0)

有时您会在不同的viewcontroller中添加相同的类名。其中一个viewcontroller有一个tableview。

答案 5 :(得分:0)

您可能错过了UITableView协议的实现,请确保已实现协议

  1. UITableViewDelegate
  2. UITableViewDataSource

在h文件上添加协议实现:

@interface YourClass : UIViewController <UITableViewDelegate,UITableViewDataSource>

@end

在m文件上添加必需的方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

答案 6 :(得分:0)

有时您没有将文件与情节提要板连接起来。

答案 7 :(得分:0)

就我而言,我提供了: 1.所有网点都正确, 2.数据源和委托权,

我所缺少的是: 我没有在情节提要中提供UIViewController的类和情节提要标识符。因此显示

-[UIViewController tableView:numberOfRowsInSection:]:无法识别的选择器已发送到实例

因为普通的UIViewController没有这些方法,所以当我们遵循UITableViewDatasource时,我们在自定义UIViewController类中提供了它。

因此,请在情节提要中检查UIViewController的身份检查器,并在其中提供正确的类。

请考虑以下图片:

enter image description here

答案 8 :(得分:0)

确保你的控制器中有这个。

extension NameController: UITableViewDelegate { // code... }

extension NameController: UITableViewDataSource { // code... }