検索バーで[キャンセル]をクリックすると、空の検索バーと元のテーブルのナビゲーションバーが表示されますビュー。コアデータから元のフィルタリングされていない配列は再ロードされません。私はストーリーボードの "ショーキャンセルボタン"をチェックしました。私は多くの記事と記事を調査しましたが、提案はありませんでした。コンソールメッセージは、キャンセルボタンが押された後、「フェッチ後のイベント:」と表示される他のメッセージの中で、2回実行されることを示しています。 "events ="、= "0、searchBarTextは空白のままです。self(自分自身の管理対象オブジェクト/イベントを含む) .events.count = 0検索バーのキャンセルボタンが元のテーブルビューとデータを再読み込みしない
EventViewController.hファイル:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface EventViewController: UITableViewController <UISearchResultsUpdating, UISearchControllerDelegate, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate>
{
IBOutlet UISearchBar *searchBar;
}
@end
EventViewController.mファイル:
#import "EventViewController.h"
#import <CoreData/CoreData.h>
#import "EventDetailViewController.h"
@interface EventViewController()
@property (nonatomic, strong) NSMutableArray *events;
@property (nonatomic, strong) UISearchController *searchController;
@property(nonatomic, weak) id<UISearchResultsUpdating> searchResultsUpdater;
@property (nonatomic,strong) UISearchBar *_searchBar;
@property(nonatomic, assign) BOOL obscuresBackgroundDuringPresentation;
@property(nonatomic, weak) id<UISearchControllerDelegate> delegate;
//@property(nonatomic, assign, getter=isActive) BOOL active;
@end
@implementation EventViewController
NSMutableArray *events;
- (NSManagedObjectContext *)managedObjectContext {
NSLog(@"Setting up managed object context");
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
// Fetch the events from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Event"];
self.events = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", self.searchController.searchBar.text];
self.events = [[self.events filteredArrayUsingPredicate:resultPredicate] mutableCopy];
}
- (BOOL)shouldReloadTableForSearchString:(UISearchController *)searchController
{
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = false;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.definesPresentationContext = true;
self.searchController.searchBar.delegate = self;
self.searchController.delegate = self;
self.searchController.obscuresBackgroundDuringPresentation = NO;
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[self.searchController.searchBar becomeFirstResponder];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Fetch the events from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Event"];
self.events = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
self.searchController.searchBar.text = nil;
[self.searchController.searchBar resignFirstResponder];
[self.tableView reloadData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
{
return [self.events count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
NSManagedObject *event = [self.events objectAtIndex:indexPath.row];
[cell.textLabel setText:[NSString stringWithFormat:@"%@", [event valueForKey:@"name"]]];
{
event = [events objectAtIndex:indexPath.row];
NSManagedObject *event = [self.events objectAtIndex:indexPath.row];
[cell.textLabel setText:[NSString stringWithFormat:@"%@", [event valueForKey:@"name"]]];
}
return cell;
}
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete object from database
[context deleteObject:[self.events objectAtIndex:indexPath.row]];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
return;
}
// Remove event from table view
[self.events removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
#pragma mark - Navigation
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)send
{
if ([[segue identifier] isEqualToString:@"UpdateEvent"]) {
NSManagedObject *selectedEvent = [self.events objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
EventDetailViewController *destViewController = segue.destinationViewController;
destViewController.event = selectedEvent;
}
}
@end
うわー、ありがとう!私はこれまでと同じようなことを試みましたが、私がチェックしていた間違った組み合わせがありました。私は今searchBarCancelButtonClickedでこれを行いました:self.searchController.searchBar.text = @ "";とupdateSearchResultsForSearchController if((self.searchController.searchBar.text.length> 0))私はあなたがリストした2つの行なしでルーチンを実行し、それは働いた!本当にありがとう!ちょうどもう1つの質問 - 結果が見つからない場合は、空白の表が表示されますが、「一致しません」と表示されますか?私はあなたに投票する方法を調べるつもりです! – RG123
はい、一致するものが見つからないと言います。最も簡単な方法は、ビューに '一致するものが見つかりません'というラベルを付けて、配列数が0のときは最初は非表示にしておくことです。あなたはテーブルビューを表示してラベルを隠すことができます。 – HardikDG
この回答が正しいとマークすることができれば、アップアップのために私の答えの左側にあるカウントの横にある上向きの矢印をチェックすることで可能ですが、あなたは15人のレフを持っています:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – HardikDG