2016-04-05 9 views
1

検索バーで[キャンセル]をクリックすると、空の検索バーと元のテーブルのナビゲーションバーが表示されますビュー。コアデータから元のフィルタリングされていない配列は再ロードされません。私はストーリーボードの "ショーキャンセルボタン"をチェックしました。私は多くの記事と記事を調査しましたが、提案はありませんでした。コンソールメッセージは、キャンセルボタンが押された後、「フェッチ後のイベント:」と表示される他のメッセージの中で、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 

答えて

1

キャンセル機能を使用すると、配列をフィルタリングしないでください。このとき、以下の行を実行しないでください。長さを確認するには、self.searchController.searchBar.textをチェックするか、ブール値を設定してキャンセルをクリックするか、テキストフィールド

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", self.searchController.searchBar.text]; 

    self.events = [[self.events filteredArrayUsingPredicate:resultPredicate] mutableCopy]; 
+0

うわー、ありがとう!私はこれまでと同じようなことを試みましたが、私がチェックしていた間違った組み合わせがありました。私は今searchBarCancelButtonClickedでこれを行いました:self.searchController.searchBar.text = @ "";とupdateSearchResultsForSearchController if((self.searchController.searchBar.text.length> 0))私はあなたがリストした2つの行なしでルーチンを実行し、それは働いた!本当にありがとう!ちょうどもう1つの質問 - 結果が見つからない場合は、空白の表が表示されますが、「一致しません」と表示されますか?私はあなたに投票する方法を調べるつもりです! – RG123

+0

はい、一致するものが見つからないと言います。最も簡単な方法は、ビューに '一致するものが見つかりません'というラベルを付けて、配列数が0のときは最初は非表示にしておくことです。あなたはテーブルビューを表示してラベルを隠すことができます。 – HardikDG

+0

この回答が正しいとマークすることができれば、アップアップのために私の答えの左側にあるカウントの横にある上向きの矢印をチェックすることで可能ですが、あなたは15人のレフを持っています:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – HardikDG

0

あなたsearchBarCancelButtonClickedではNO = self.searchController.activeを追加します。 reloadData

は、のviewDidLoad

で財産

@property (strong, nonatomic) UISearchController *searchController; 

を追加した.h

でUISearchBarDelegateを追加ストーリーボード

に任意の検索コントロールをドロップしない、コードで検索コントローラを作成する前に前に

self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
self.searchController.searchResultsUpdater = self; 
self.searchController.dimsBackgroundDuringPresentation = NO; 
self.searchController.searchBar.delegate = self; 

self.tableView.tableHeaderView = self.searchController.searchBar; 
self.definesPresentationContext = YES; 
[self.searchController.searchBar sizeToFit]; 
+0

ご提案いただきありがとうございますが、機能しませんでした。 – RG123

+0

投稿の最後にトレースの結果を追加しました。また、ストーリーボードでは、検索バーと検索ディスプレイコントローラオブジェクトを使用しました。これが私の問題に寄与しているのかどうかは疑問です。必要に応じて接続の写真を追加することができます。私は初心者で、本当に立ち往生しています。ありがとうございました。 – RG123

関連する問題