UITabelView 与 UISearchDisplayDelegate
我正在尝试使用 UISearchDisplayDelegate 设置一个简单的 UITableView,但我的应用程序不断崩溃并出现 SIGABRT 错误: [self.filteredListContent removeAllObjects];
关于为什么会发生这种情况的任何想法
#import "SearchViewController.h"
@implementation SearchViewController
@synthesize listContent, filteredListContent;
- (void)viewDidLoad
{
[super viewDidLoad];
listContent = [[NSArray alloc]initWithObjects:@"hello", @"bye", nil];
filteredListContent = [NSMutableArray arrayWithCapacity:listContent.count];
[self.tableView reloadData];
self.tableView.scrollEnabled = YES;
}
- (void)viewDidUnload
{
[super viewDidUnload];
self.listContent =nil;
self.filteredListContent=nil;
}
-(void) dealloc {
[super dealloc];
[self.listContent release];
[self.filteredListContent release];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return [self.filteredListContent count];
}
else
{
return [self.listContent count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSString *label;
if (tableView == self.searchDisplayController.searchResultsTableView)
{
label = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
label = [self.listContent objectAtIndex:indexPath.row];
}
cell.textLabel.text = label;
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (void)filterContentForSearchText:(NSString*)searchText
{
[self.filteredListContent removeAllObjects];
for (NSString *string in listContent)
{
NSComparisonResult result = [string compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:string];
}
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text]];
return YES;
}
头文件
#import <UIKit/UIKit.h>
@interface SearchViewController : UITableViewController<UISearchDisplayDelegate, UISearchBarDelegate> {
NSArray *listContent;
NSMutableArray *filteredListContent;
}
@property (nonatomic, retain) NSArray *listContent;
@property (nonatomic, retain) NSMutableArray *filteredListContent;
@end
I'm trying to set up a simple UITableView with a UISearchDisplayDelegate but my app keeps crashing with a SIGABRT error for : [self.filteredListContent removeAllObjects];
Any ideas on why this is happening
#import "SearchViewController.h"
@implementation SearchViewController
@synthesize listContent, filteredListContent;
- (void)viewDidLoad
{
[super viewDidLoad];
listContent = [[NSArray alloc]initWithObjects:@"hello", @"bye", nil];
filteredListContent = [NSMutableArray arrayWithCapacity:listContent.count];
[self.tableView reloadData];
self.tableView.scrollEnabled = YES;
}
- (void)viewDidUnload
{
[super viewDidUnload];
self.listContent =nil;
self.filteredListContent=nil;
}
-(void) dealloc {
[super dealloc];
[self.listContent release];
[self.filteredListContent release];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return [self.filteredListContent count];
}
else
{
return [self.listContent count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSString *label;
if (tableView == self.searchDisplayController.searchResultsTableView)
{
label = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
label = [self.listContent objectAtIndex:indexPath.row];
}
cell.textLabel.text = label;
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (void)filterContentForSearchText:(NSString*)searchText
{
[self.filteredListContent removeAllObjects];
for (NSString *string in listContent)
{
NSComparisonResult result = [string compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:string];
}
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterContentForSearchText:[self.searchDisplayController.searchBar text]];
return YES;
}
header file
#import <UIKit/UIKit.h>
@interface SearchViewController : UITableViewController<UISearchDisplayDelegate, UISearchBarDelegate> {
NSArray *listContent;
NSMutableArray *filteredListContent;
}
@property (nonatomic, retain) NSArray *listContent;
@property (nonatomic, retain) NSMutableArray *filteredListContent;
@end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
替换
为
or
这是因为当您直接访问变量时,不会调用
retain
。始终使用self.
表示法。Replace
with
or
This is because when you access your variable directly
retain
is not called. Always useself.
notation.