Ghobs
Ghobs

Reputation: 859

numberOfRowsInSection is causing unrecognized selector crash

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

enter image description here

enter image description here

Upvotes: 0

Views: 2283

Answers (3)

Alisha Mahajan
Alisha Mahajan

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

Lord Zsolt
Lord Zsolt

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):

  1. dealloc (if you have one)
  2. initializer methods (init, initWithFrame, etc.)
  3. Other methods, the related ones grouped up, usually separated with #pragma mark.

Upvotes: 0

Jesse Naugher
Jesse Naugher

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

Related Questions