簡體   English   中英

numberOfRowsInSection 導致無法識別的選擇器崩潰

[英]numberOfRowsInSection is causing unrecognized selector crash

我的視圖控制器中有一個 UITableView 設置,用於填充函數返回的 JSON 數據。 當我加載 MatchCenterViewController 時,應用程序崩潰並收到以下錯誤:

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

在此處輸入圖片說明

在此處輸入圖片說明

你設置UITableViewDelegateUITableViewDataSource您的tableView到UIView ,而不是你的MatchCenterViewController接口生成器。

UIView沒有實現UITableViewDataSource ,這就是為什么您會收到無法識別的選擇器錯誤的原因。

您需要將delegatedataSource設置為實現委托方法的類。 在您的情況下,這是您的MatchCenterViewController

我注意到的另一件事是,您在viewDidLoadviewDidAppear上都調用了PFCloud方法。 您應該只在一個地方執行此操作,如果您希望它執行一個,請將其添加到viewDidLoad ,如果您希望每次顯示view都執行它,請將其添加到viewDidAppear

還有一件小事:你應該按照從上到下的順序(在你的文件中)有方法:

  1. dealloc(如果你有的話)
  2. 初始化方法( initinitWithFrame等)
  3. 其他方法,相關的分組在一起,通常用#pragma mark分隔。

您需要設置MatchCenterViewController類作為數據源委托matchCenter表視圖。

initWithNibName函數中添加以下兩行代碼

[matchCenter setDelegate:self];

[matchCenter setDataSource:self];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM