Reputation: 859
I have a UITableView setup within my view controller to populate with the JSON data that's being returned by a function. When I load MatchCenterViewController, the app crashes and I receive the following error:
2014-06-07 15:56:23.651 Parse+Storyboard[6848:607] -[UIView tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xaa29730
2014-06-07 15:56:23.825 Parse+Storyboard[6848:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xaa29730'
*** First throw call stack:
(
0 CoreFoundation 0x02a8c1e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x0264a8e5 objc_exception_throw + 44
2 CoreFoundation 0x02b29243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x02a7c50b ___forwarding___ + 1019
4 CoreFoundation 0x02a7c0ee _CF_forwarding_prep_0 + 14
5 UIKit 0x0156f94c -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2510
6 UIKit 0x0157323d -[UITableViewRowData numberOfRows] + 98
7 UIKit 0x013f0df2 -[UITableView noteNumberOfRowsChanged] + 120
8 UIKit 0x013f07a5 -[UITableView reloadData] + 814
9 UIKit 0x013f43b3 -[UITableView _reloadDataIfNeeded] + 65
10 UIKit 0x013f95f4 -[UITableView layoutSubviews] + 36
11 UIKit 0x01379964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
12 libobjc.A.dylib 0x0265c82b -[NSObject performSelector:withObject:] + 70
13 QuartzCore 0x0064f45a -[CALayer layoutSublayers] + 148
14 QuartzCore 0x00643244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
15 QuartzCore 0x006430b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
16 QuartzCore 0x005a97fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
17 QuartzCore 0x005aab85 _ZN2CA11Transaction6commitEv + 393
18 QuartzCore 0x006685b0 +[CATransaction flush] + 52
19 UIKit 0x013089bb _UIApplicationHandleEventQueue + 13095
20 CoreFoundation 0x02a1577f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
21 CoreFoundation 0x02a1510b __CFRunLoopDoSources0 + 235
22 CoreFoundation 0x02a321ae __CFRunLoopRun + 910
23 CoreFoundation 0x02a319d3 CFRunLoopRunSpecific + 467
24 CoreFoundation 0x02a317eb CFRunLoopRunInMode + 123
25 GraphicsServices 0x02ce95ee GSEventRunModal + 192
26 GraphicsServices 0x02ce942b GSEventRun + 104
27 UIKit 0x0130af9b UIApplicationMain + 1225
28 Parse+Storyboard 0x00002cbd main + 141
29 libdyld.dylib 0x038e56d9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
I've checked UIView tableView:numberOfRowsInSection
that the error code refers to, and I don't see what could be causing this, as it simply tells it that there are 3 rows. Code and screenshots are below.
MatchCenterViewController.m:
#import "MatchCenterViewController.h"
#import <UIKit/UIKit.h>
@interface MatchCenterViewController () <UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *matchCenter;
@end
@implementation MatchCenterViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSDictionary *matchCenterDictionary= [self.matchCenterArray objectAtIndex:indexPath.row];
cell.textLabel.text = [matchCenterDictionary objectForKey:@"Title"];// title of the first object
// if([matchCenterDictionary objectForKey:@"Price"] != NULL)
// {
// cell.detailTextLabel.text = [NSString stringWithFormat:@"$%@",[matchCenterDictionary objectForKey:@"Price"]];
// }
return cell;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.matchCenterArray = [[NSArray alloc] init];
//perform search with criteria just submitted
[PFCloud callFunctionInBackground:@"MatchCenterTest"
withParameters:@{
@"test": @"Hi",
}
block:^(NSDictionary *result, NSError *error) {
if (!error) {
self.matchCenterArray = [result objectForKey:@"Top 3"];
dispatch_async(dispatch_get_main_queue(), ^{
[_matchCenter reloadData];
});
NSLog(@"Test Result: '%@'", result);
}
}];
}
- (void)viewDidAppear:(BOOL)animated
{
[PFCloud callFunctionInBackground:@"MatchCenterTest"
withParameters:@{
@"test": @"Hi",
}
block:^(NSDictionary *result, NSError *error) {
if (!error) {
self.matchCenterArray = [result objectForKey:@"Top 3"];
dispatch_async(dispatch_get_main_queue(), ^{
[_matchCenter reloadData];
});
NSLog(@"Test Result: '%@'", result);
}
}];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
Upvotes: 0
Views: 2283
Reputation: 11
You need to set MatchCenterViewController class as dataSource and delegate for your matchCenter table view.
Add following 2 lines of code in initWithNibName
function
[matchCenter setDelegate:self];
[matchCenter setDataSource:self];
Upvotes: 0
Reputation: 6557
You need to set the delegate
and dataSource
to the class that implements the delegate methods. In your case, that's your MatchCenterViewController
.
Also another thing I notice, you're calling the PFCloud
method both on viewDidLoad
and viewDidAppear
. You should only do that in one place, if you want it to execute one, add it to the viewDidLoad
, if you want it to execute every time the view
is shown, add it to viewDidAppear
.
And another small thing: You should have methods in the order from top to bottom (in your file):
init
, initWithFrame
, etc.)#pragma mark
.Upvotes: 0
Reputation: 9820
You're setting the UITableViewDelegate
and UITableViewDataSource
of your tableView to the UIView
and not your MatchCenterViewController
in interface builder.
UIView
doesn't implement UITableViewDataSource
and that's why you are getting an unrecognized selector error.
Upvotes: 5