这个错误是啥意思?
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
【讨论】:
以上是关于这个错误是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章