这个错误是啥意思?

Posted

技术标签:

【中文标题】这个错误是啥意思?【英文标题】:What does this error mean?这个错误是什么意思? 【发布时间】:2014-03-30 19:47:06 【问题描述】:

我试图让搜索过滤器为我的 tableview 工作,当我单击搜索栏时应用程序崩溃并返回此错误

2014-03-30 14:44:08.676 BookStore[16156:90b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[PFObject rangeOfString:options:]:无法识别的选择器发送到实例0x9da1a40' * 首先抛出调用栈:

代码如下:

//
//  PDFTableViewController.m
//  BookStore
//
//  Created by Danijel Kujundzic on 3/23/14.
//  Copyright (c) 2014 Danijel Kujundzic. All rights reserved.
//

#import "PDFTableViewController.h"
#import "PDFDetailViewController.h"
@interface PDFTableViewController ()<UISearchBarDelegate , UISearchDisplayDelegate>

  NSMutableArray * filteredStrings;
    BOOL isFiltered;


@end

@implementation PDFTableViewController




@synthesize PDFtableView;


- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    [self performSelector:@selector(RetrievePDFParseData)];
    self.SearchBar.delegate =self;
    self.PDFtableView.delegate=self;
    self.PDFtableView.dataSource =self;
    filteredStrings = [[NSMutableArray alloc] initWithArray:PDFArray];




- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

    if (searchText.length ==0) 
        isFiltered= NO;
        [filteredStrings removeAllObjects];
        [self.tableView reloadData];
        [searchBar resignFirstResponder];
    
    else
    
        isFiltered = YES;
        if([PDFArray count]!=0)
        
            NSPredicate *p=[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) 
                NSString *s=evaluatedObject;
                return ([s rangeOfString:searchBar.text options:NSCaseInsensitiveSearch].location !=NSNotFound);
            ];
            filteredStrings= [NSMutableArray arrayWithArray:[PDFArray filteredArrayUsingPredicate:p]];
            //table reload
            [self.tableView reloadData];
        

    





-(void) RetrievePDFParseData 
    PFQuery * getPDF = [PFQuery queryWithClassName:@"PDFTableView"];

    [getPDF findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
        if(!error) 
           PDFArray =[[NSArray alloc] initWithArray: objects];

        
        [PDFtableView reloadData];

    ];






- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


#pragma mark - Table view data source





- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if (isFiltered) 
        return [filteredStrings count];
    


    return [PDFArray count];



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        static NSString * CellIdentifier = @"Cell";
        UITableViewCell * cell = [PDFtableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell ==nil) 
            cell = [[ UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
        

        if (!isFiltered) 
            PFObject * tempObject = [PDFArray objectAtIndex:indexPath.row];
            cell.textLabel.text = [tempObject objectForKey:@"PDFName"];
            cell.detailTextLabel.text= [tempObject objectForKey:@"Author"];
        

        if (isFiltered)


        
            PFObject *filteredObject= [[filteredStrings objectAtIndex:indexPath.row]initWithArray:PDFArray];
            cell.textLabel.text =[filteredObject objectForKey:@"PDFName"];
            cell.detailTextLabel.text= [filteredObject objectForKey:@"Author"];
            NSLog(@"%@", filteredObject);
        


        return cell;

    


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    [self performSegueWithIdentifier:@"detailSegue" sender:self];


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if([segue.identifier isEqualToString:@"detailSegue"])

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        PDFDetailViewController *detailVC = (PDFDetailViewController *)segue.destinationViewController;
        NSLog(@"Bookarray=%@", PDFArray);
        NSLog(@"BookIndex=%@", [PDFArray objectAtIndex:indexPath.row]);
        detailVC.PDFna=[[PDFArray objectAtIndex:indexPath.row]objectForKey:@"PDFName"];
        detailVC.PDFdes= [[PDFArray objectAtIndex:indexPath.row]objectForKey:@"About"];
        detailVC.downloadfile=[[PDFArray objectAtIndex:indexPath.row]objectForKey:@"PDFFile"];


    



@end

【问题讨论】:

【参考方案1】:

你认为是 NSStrings 的对象数组实际上是 PFObjects。 PDFArray 包含一个 PFObject 的数组。您可能希望在 UISearchBarDelegate 方法中创建的谓词中获取某个属性,

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

NSString *s = evaluatedObject[@"PDFName"]; 之类的东西,或者类似的东西会让你实际上是在过滤 PDF 文件的名称。

【讨论】:

我刚刚尝试过,但它没有在“已过滤”选项实例 0x9a173e0 2014-03-30 14:59:58.614 BookStore[16310:90b] 中的行方法的单元格上崩溃 *** 终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因:'-[PFObject initWithArray:]: unrecognized selector sent to instance 0x9a173e0' 啊,你是国王!!!你甚至不明白我花了多长时间才这样做……我爱你!【参考方案2】:

错误在searchBar:textDidChange: 方法中。在这种情况下,谓词返回PFObject,而不是NSString。因此,您必须在 evaluatedObject 对象中搜索您需要的 NSString 对象。

这些是有问题的行:

NSString *s=evaluatedObject;
return ([s rangeOfString:searchBar.text options:NSCaseInsensitiveSearch].location !=NSNotFound);

rangeOfString 上抛出异常,因为PFObject 没有响应rangeOfString

在其他语言中,编译器有时会警告您这种情况。在 Objective-C 中,处理任何类型的对象时都必须小心:id。编译器不会检查特定对象是否在编译时响应消息。但是当 Objective-C 运行时在运行时执行此操作时,您会遇到崩溃。

阅读更多关于 Objective-C 中的对象和消息的信息: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html

【讨论】:

以上是关于这个错误是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

这个 NSZombie 错误消息是啥意思?

Django插入:这个错误是啥意思

这个 MSVC++ 编译错误是啥意思

这个错误在 nhibernate 中是啥意思

这个错误是啥意思?

嗨,只想知道这个错误是啥意思