2016-04-05 14 views
1

Die Suche und alles andere funktioniert gut, außer wenn ich in der Suchleiste auf Abbrechen klicke, erscheint ein leerer Bildschirm mit der leeren Suchleiste und der Navigationsleiste der Originaltabelle Aussicht. Das ursprüngliche ungefilterte Array von Core Data wird nicht neu geladen. Ich habe den "Shows cancel button" im Storyboard überprüft. Ich habe viele Beiträge und Artikel recherchiert, aber keine Vorschläge haben funktioniert. Die Konsolennachrichten zeigen, dass nach dem Drücken der Abbrechen-Schaltfläche neben anderen Nachrichten die "Ereignisse nach dem Abruf:" zweimal ausgeführt wird. Die zweite (letzte) Zeit hat alle meine verwalteten Objekte/Ereignisse darin, aber dann "gefilterte Array:" ist leer, "Ereignisse:" ist leer, "events.self.count:" = 0, searchBarText ist leer, self .events.count = 0.Suchleiste Abbrechen Schaltfläche lädt die ursprüngliche Tabellenansicht und Daten nicht

EventViewController.h Datei:

#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 Datei:

#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 

Antwort

1

Wenn Sie die anrufen cancel function Sie sollten das Array nicht filtern, deshalb sollten Sie die Zeilen, die ich unten erwähnt habe, nicht ausführen. Dazu können Sie die Länge von self.searchController.searchBar.text überprüfen oder einen Boolean setzen, um zu prüfen, ob auf Abbrechen geklickt oder Text eingegeben wurde Textfeld

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

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

Wow - danke! Ich hatte schon einmal so etwas probiert, aber hatte die falsche Kombination, die ich überprüfte. Das habe ich jetzt in searchBarCancelButtonClicked getan: self.searchController.searchBar.text = @ ""; und in updateSearchResultsForSearchController if ((self.searchController.searchBar.text.length> length> 0)) Ich habe die ganze Routine sonst ohne die zwei Zeilen ausgeführt, die Sie aufgelistet haben, und es hat funktioniert! Vielen Dank! Nur noch eine Frage - Wenn keine Ergebnisse gefunden werden, erscheint die leere Tabelle, sollte aber auch "no match found" angezeigt werden? Ich werde schauen, wie man dich abstimmt! – RG123

+0

Ja, es sollte keine Übereinstimmung gefunden werden, denn auf die einfachste Art und Weise können Sie ein Label mit 'no match found' in die Ansicht einfügen und es anfangs verborgen halten, wenn die Array-Anzahl 0 ist, die Tabellenansicht ausblenden und das Label und die Anzahl anzeigen größer ist, können Sie die Tabellenansicht anzeigen und das Label ausblenden – HardikDG

+0

Wenn diese Antwort hilft, können Sie die Antwort als richtig markieren, für die Verbesserung können Sie tun, indem Sie auf der linken Seite meiner Antwort den Pfeil nach oben neben zählen, aber es wird nur angezeigt, wenn Sie haben 15 Wiederholungen mehr ref: http: //meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – HardikDG

0

in Ihrem searchBarCancelButtonClicked hinzufügen self.searchController.active = NO; vor, bevor reload

in Code erstellen Suchsteuerung nicht fallen keine Suchmaske in Storyboard

UISearchBarDelegate hinzufügen in .h

Eigenschaft hinzufügen

@property (strong, nonatomic) UISearchController *searchController; 

in viewDidLoad

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

Vielen Dank für Ihren Vorschlag, aber es hat nicht funktioniert. – RG123

+0

Ich habe die Ergebnisse meiner Spur am Ende meiner Post hinzugefügt. Außerdem habe ich im Storyboard die Suchleiste und das Such-Display-Controller-Objekt verwendet - ich frage mich, ob das zu meinem Problem beitragen könnte. Ich könnte Bilder der Verbindungen bei Bedarf hinzufügen. Ich bin ein Anfänger und wirklich fest. Vielen Dank. – RG123

Verwandte Themen