2014-06-07 2 views
0

У меня есть настройка UITableView в моем контроллере представления для заполнения данными JSON, которые возвращаются функцией. Когда я загружаю MatchCenterViewController, сбои приложения, и я получаю следующее сообщение об ошибке:numberOfRowsInSection вызывает непризнанный сбой селектора

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 

Я проверил UIView tableView:numberOfRowsInSection, что код ошибки означает, и я не вижу, что может быть причиной этого, как он просто говорит это то, что есть 3 строки. Ниже приведены коды и скриншоты.

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

ответ

3

Вы установки UITableViewDelegate и UITableViewDataSource вашего Tableview к UIView и не ваш MatchCenterViewController в интерфейсе строителя.

UIView не реализует UITableViewDataSource, и именно поэтому вы получаете нераспознанную ошибку выбора.

+0

Ahh Я вижу. Я немного смущен в отношении того, как я могу это изменить. Это что-то я изменил в раскадровке или в файле реализации? Я попытался изменить класс tableview на 'MatchCenterViewController' в настройках раскадровки, но он продолжает возвращаться к' UITableView'. – Ghobs

0

Вы должны установить delegate и dataSource классу, который реализует методы делегата. В вашем случае это ваш MatchCenterViewController.

Также я замечаю, что вы вызываете метод PFCloud как на viewDidLoad, так и на viewDidAppear. Вам нужно сделать это только в одном месте, если вы хотите его выполнить, добавьте его в viewDidLoad, если вы хотите, чтобы он выполнялся каждый раз, когда отображается view, добавьте его в viewDidAppear.

И еще одна маленькая вещь: Вы должны иметь методы в порядке сверху вниз (в файле):

  1. dealloc (если у вас есть один)
  2. методы инициализатора (init, initWithFrame, и т.д. .)
  3. Другие методы, связанные сгруппированные, обычно разделенные #pragma mark.
Смежные вопросы