Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS : 'MyViewController' does not conform to protocol 'UITableViewDataSource'

Tags:

  • I am new to IOS swift development. I used to work with previous Xcode 6 beta.

  • I have downloaded the Xcode 6.0.1 and I can not get this to work Xcode Version: 6.0.1

  • I am still getting "'MyViewController' does not confirm to protocol 'UITableViewDataSource' " when I try to run the example.

Can someone please help me? I have gone through other issues on this site and added all the required functions for "UITableViewDataSource";


import UIKit import Foundation  class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {  var array1:[String] = ["one","two","three","four"]      var array2:[String] = ["IOS","Android","java","c++","Swift"]      let sectionCount = 2      var myTableView:UITableView!      //    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {     //        var rect = CGRectMake(0, 0, 220, 320)     //        myTableView = UITableView(frame: rect, style: UITableViewStyle.Grouped)     //        super.init(nibName: nil, bundle: nil)     //        // Custom initialization     //    }      override func viewDidLoad() {         super.viewDidLoad()          var rect = CGRectMake(0, 0, 320, 600)         myTableView = UITableView(frame: rect, style: UITableViewStyle.Grouped)         myTableView!.delegate = self         myTableView!.dataSource = self         self.view.addSubview(myTableView)      }      override func didReceiveMemoryWarning() {         super.didReceiveMemoryWarning()         // Dispose of any resources that can be recreated.     }       //dataSourrce     //tableview:tableview,section:     func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{         switch section{         case 0:             return array1.count         case 1:             return array2.count         default:             return 1         }      }       func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {         //func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{          //---cellstart----         let identifier = "identifier"         //        var cell:UITableViewCell         //cell         var cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? MyCell         if cell == nil {             //            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifier)             cell = MyCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifier)         }         //---cellend----          switch indexPath.section{         case 0:             //            cell!.textLabel.text = array1[indexPath.row]             cell!.myLable!.text = array1[indexPath.row]         case 1:             //            cell!.textLabel.text = array2[indexPath.row]             cell!.myLable!.text = array2[indexPath.row]         default:             println()         }         var image = UIImage(named: "images/qq.png")         //        cell!.imageView.image = image         cell!.myImageView!.image = image         //        cell!.detailTextLabel.text = "\(indexPath.section)\(indexPath.row)         return cell!     }    //dataSourrce     func numberOfSectionsInTableView(tableView: UITableView!) -> Int {         return sectionCount     }      func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {         var title:String? = nil         switch section {         case 0:             title = "Num"         case 1:             title = "Prog"         default:             title = nil         }         return title     }      func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {         println("Test\(indexPath.section) \(indexPath.row)")     }       func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {         return 60.0     }        func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int {}      func pickerView(pickerView: UIPickerView!,numberOfRowsInComponent component: Int) -> Int{}      func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?{     }      func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{     }  } 

***************** My Cell Class ***********************************

import Foundation import UIKit  class MyCell: UITableViewCell {      let indetifier:String = "indetifier"       var myLable:UILabel?       var myImageView:UIImageView?          override init(style: UITableViewCellStyle, reuseIdentifier: String!)         {         super.init(style: .Subtitle, reuseIdentifier: indetifier)          var rect = CGRectMake(10, 0, 60, 30)         self.myLable = UILabel()         self.myLable!.frame = rect         self.myLable!.textColor = UIColor.redColor()         self.contentView.addSubview(self.myLable!)          var imageRect = CGRectMake(160, 10, 40, 40)         self.myImageView = UIImageView()         self.myImageView!.frame = imageRect         self.contentView.addSubview(self.myImageView!)       }          required init(coder aDecoder: NSCoder) {             fatalError("init(coder:) has not been implemented")         } } 
like image 433
Kam K Avatar asked Sep 19 '14 14:09

Kam K


2 Answers

You need to look at the whole error message. This specific message includes additional information about which methods are missing:

Type 'MyViewController' does not conform to protocol 'UITableViewDataSource' Protocol requires function 'tableView(_:numberOfRowsInSection:)' with type '(UITableView, numberOfRowsInSection: Int) -> Int' Candidate has non-matching type '(UITableView!, numberOfRowsInSection: Int) -> Int' 

So... your numberOfRowsInSection takes an optional UITableView, and should take a required UITableView (this is a change they made between 6 and 6.1, all UITableView delegate and datasource methods now take required tableView and indexPath values)

like image 141
David Berry Avatar answered Nov 01 '22 19:11

David Berry


Try this simple solution:

import UIKit  class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {     //MARK: - Life Cycle     override func viewDidLoad() {         super.viewDidLoad()     }      override func didReceiveMemoryWarning() {         super.didReceiveMemoryWarning()     }      //MARK: - Tableview Delegate & Datasource     func tableView(tableView:UITableView, numberOfRowsInSection section:Int) -> Int     {         return 10     }      func numberOfSectionsInTableView(tableView: UITableView) -> Int     {         return 1     }      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell     {          let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")         return cell     }      func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)     {      }  } 
like image 29
Rajesh Loganathan Avatar answered Nov 01 '22 19:11

Rajesh Loganathan