2015-10-15 111 views
0

在这里我有一个ViewController,顶部有一个搜索栏和它下面的一个tableView,我期望的是tableView显示所有的东西,当没有搜索,如果有搜索,搜索的表格将显示搜索结果。我已经实现了它,但有一些错误,这是tableView可以正确显示的东西,而无需搜索,但是当我搜索时,搜索栏下方的表视图什么也没有显示,我NSLog out rowInSection,并找到它是正确的,但为什么没有出现? 这里是代码,有人可以过去发现错误?提前致谢。 (我在TableViewController中做了同样的事情,它工作,但我切换到ViewController,它不工作)。查看控制器中的搜索栏和搜索显示控制器在其中有一个UITableView

//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; 
} 
+0

您是否记得将tableview.delegate和tableView.dataSource设置为self? – scord

+0

是的,我确实设置了,并且tableview可以正确显示,但是当我想要做一些搜索时,搜索控制器的tableview无法正确显示。 –

+0

您是否设置了UISearchDisplayController以使用搜索栏?你的搜索栏是你的tableview的子视图吗? – beyowulf

回答

0

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

无论如何,对于您当前的问题,我认为这是由于您没有设置searchDisplayController的searchResultsTableView的数据源和委托而造成的。

在viewDidLoad中,你应该做

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

简单的设置委托和IBOutlet中“myTableView”的数据源,因为一旦你开始搜索时,searchDisplayController提出了自己的tableView“searchDisplayController不会做的伎俩。 searchResultsTableView“位于当前视图的顶部。当前视图控制器需要为searchResultsTableView的数据源和委托。

希望这可以/帮助!

+0

嗨,谢谢为你的答案,但我已经尝试过你说的,它没有奏效。我遇到的问题是,当我搜索时,出现了一个resultTableView,但是这个新的tableView仅包含空白单元!,并且在控制台中NSLog记录了行数,它看起来应该是正确的。我有点无法弄清楚为什么这个单元格是空白的。你可以看看我在我的问题中更新的图片。非常感谢你。 –

+0

很高兴你知道了! – Midas

0

谢谢大家,我想通了,因为我写了

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

,但它应该是这样的

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

什么错误!

相关问题