问题
I am very new to Swift as I justed started on it only a few months back. I have an aching problem with this error.
-[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance XXX
Here is a list of possible fixes that I have so far gathered and implemented already.
- I have changed the Custom Class to
CheckboxQuestion
class instead of theUIViewController
class.
Custom Class
I have connected the tableview to the datasource and delegate.
I have accounted for all loose referencing outlets.
I have named the reusable identifier outlet for each prototype cell.
prototype cell 1
After all those, I am still getting the error above.
The breakpoint of the exception error happened in the appdelegate class at this line
class AppDelegate: UIResponder, UIApplicationDelegate {
Is there something else which I am missing?
Here is the code for CheckboxQuestion Class code
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.
}
}
回答1:
please ensure you deleted outlets from code but not from storyboard.just right click on tableview from storyboard .delete outlets and reconnect it.May be you have added two outlets for same tableview.
回答2:
You're implementing UITableViewDelegate
/UITableViewDataSource
methods, but it doesn't seem like your class conforms to either of them. Since you're inheriting from UIViewController
, you'll need to add those protocols and set the delegate
and dataSource
of the table view to self
:
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
If the view controller only shows a view controller, you should consider using a UITableViewController
instead of UIViewController
, then the stuff above doesn't apply - you get that for free with a UITableViewController
. But I can't tell from code if this is the case.
回答3:
I think in this case you may have forget to assign tableview delegate and datasource to self.
self.tableView.dataSource = self
self.tableView.delegate = self
回答4:
Make sure you have added below.
class ViewController: UIViewController
,UITableViewDataSource,UITableViewDelegate{
And also connected the delegate
and datasource
to tableview
in stoaryboard.
回答5:
sometimes you add a same class name in different viewcontroller. one of these viewcontroller have a tableview.
回答6:
You probably missed UITableView protocol implementation, Make sure you implemented the protocols you're required to implement.
- UITableViewDelegate
- UITableViewDataSource
add protocols implementations on h file:
@interface YourClass : UIViewController <UITableViewDelegate,UITableViewDataSource>
@end
add required methods on m file:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
回答7:
Sometimes you are not connected your file with the storyboard.
回答8:
In my case, I had provided: 1. all the outlets right, 2. datasource and delegate right,
The thing i was missing was: I hadn't provided the class and storyboard identifier for UIViewController in the storyboard. hence it shows
-[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance
because a normal UIViewController does not have these methods, when we conform to UITableViewDatasource, we provide it in our custom UIViewController class.
So please check the identity inspector for UIViewController in the storyboard and provide the proper class there.
Consider the following image:
来源:https://stackoverflow.com/questions/34692160/uiviewcontroller-tableviewnumberofrowsinsection-unrecognized-selector-sent