【发布时间】:2015-10-15 22:03:22
【问题描述】:
这里我有一个ViewController,顶部有一个搜索栏,下面有一个tableView,我希望tableView在没有搜索的时候显示所有的东西,然后如果有一些搜索,搜索的tableview会显示搜索结果。而且我已经实现了,但是出了点问题,就是tableView可以在不搜索的情况下正确显示,但是当我进行搜索时,搜索栏下方的table view什么也没显示,我NSLog out rowInSection,然后找到它是正确的,但为什么什么都没有出现? 这是代码,有人可以过去发现错误吗?提前致谢。 (我在 TableViewController 中做了同样的事情,它工作,但我切换到 ViewController,它没有工作)。
//MySearchViewController.h
@interface MySearchViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *myTableView;
- (void)reloadView;
@end
//MySearchViewController.m
@interface MySearchViewController ()
@property NSUserDefaults *usrDefault;
@end
@implementation MySearchViewController {
NSMutableArray *events;
NSArray *searchResults;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.usrDefault = [NSUserDefaults standardUserDefaults];
events = [[NSMutableArray alloc] init];
[self extractEventArrayData];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
[self reloadView];
}
- (void)reloadView {
NSLog(@"reloadView");
events = [[NSMutableArray alloc] init];
[self extractEventArrayData];
[self.myTableView reloadData];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)extractEventArrayData {
NSArray *dataArray = [[NSArray alloc] initWithArray:[self.usrDefault objectForKey:@"eventDataArray"]];
for (NSDate *dataObject in dataArray) {
MyEventInfo *eventDecodedObject = [NSKeyedUnarchiver unarchiveObjectWithData:dataObject];
[events addObject:eventDecodedObject];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
NSLog(@"searchResults count:%lu",(unsigned long)[searchResults count]);
return [searchResults count];
} else {
return [events count];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 360;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CustomTableCell";
MyEventTableViewCell *cell = (MyEventTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
if (cell == nil) {
cell = [[MyEventTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Display MyEventTableViewCell in the table cell
MyEventInfo *event = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
event = [searchResults objectAtIndex:indexPath.row];
} else {
event = [events objectAtIndex:indexPath.row];
}
cell.nameOfEvent.text = event.nameOfEvent;
cell.imageOfEvent.image = [UIImage imageNamed:event.imageOfEvent];
cell.timeOfEvent.text = event.timeOfEvent;
cell.locationOfEvent.text = event.locationOfEvent;
cell.dateOfEvent.text = event.dateOfEvent;
return cell;
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"nameOfEvent contains[c] %@", searchText];
searchResults = [events filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
【问题讨论】:
-
你记得设置tableview.delegate和tableView.dataSource为self吗?
-
是的,我确实设置了,tableview可以正确显示,但是当我想做一些搜索时,搜索控制器的tableview无法正确显示。
-
您是否设置了一个 UISearchDisplayController 来配合您的搜索栏?您的搜索栏是您的 tableview 的子视图吗?
-
是的,我在这里发布了同样的问题,可能更具体。stackoverflow.com/questions/33162041/…
标签: ios objective-c uitableview uiviewcontroller uisearchbar