在View Controller中搜索栏和搜索显示控制器,其中包含UITableView

时间:2015-10-15 22:03:23

标签: ios objective-c uitableview uiviewcontroller uisearchbar

这里我有一个ViewController,顶部有一个搜索栏,下面有一个tableView,我期望的是tableView在没有搜索时显示所有内容,然后如果有搜索,搜索的话题tableview将显示搜索结果。并且我已经实现了它,但是有一些错误,这就是tableView无需搜索即可正确显示内容,但是当我进行搜索时,搜索栏下面的表格视图没有显示任何内容,我NS注销了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;
}

2 个答案:

答案 0 :(得分:0)

首先, UISearchDisplayController在iOS 8中已弃用。您应该使用UISearchController。我相信您正在使用UISearchDisplayController,因为您在Storyboard中进行了设置,Apple没有更新Storyboard的对象库以使用UISearchController。但是,您仍然应该转换为UISearchController并在代码中实现所有内容,直到Apple更新Storyboard对象库。在代码中设置非常简单。

无论如何,我认为这是因为您没有设置searchDisplayController的searchResultsTableView的数据源和委托。

在viewDidLoad中,您应该

searchDisplayController.searchResultsTableView.delegate = self;
searchDisplayController.searchResultsTableView.dataSource = self;

只需设置IBOutlet的代理和数据源&#34; myTableView&#34;不会这样做,因为一旦你开始搜索,searchDisplayController会呈现自己的tableView&#34; searchDisplayController.searchResultsTableView&#34;在当前视图之上。当前视图控制器需要是 searchResultsTableView 的dataSource和委托。

希望这有效/有帮助!

答案 1 :(得分:0)

谢谢大家,我想出来了,因为我写了

MyEventTableViewCell *cell = (MyEventTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

但它应该是这样的

MyEventTableViewCell *cell = (MyEventTableViewCell *)[self.myTableView dequeueReusableCellWithIdentifier:CellIdentifier];

真是个错误!