2016-04-05 12 views
1

Arama çubuğunda İptal düğmesini tıklattığımda arama ve diğer her şey yolunda gidiyor, boş arama çubuğu üzerinde boş bir ekran ve orijinal tablonun gezinme çubuğu görünüyor görünüm. Özgün, filtresiz, Çekirdek Veriler dizisi yeniden yüklenmedi. Film şeridindeki "İptal butonunu göster" seçeneğini işaretledim. Birçok yazı ve makaleyi araştırdım, ancak hiçbir öneri çalışmadı. Konsol mesajları, İptal düğmesine basıldıktan sonra diğer mesajların yanında "Getirildikten Sonra Olaylar:" ın iki kez yürütüldüğünü gösterir. İkinci (son) zaman içinde tüm yönetilen nesnelerim/olaylarım var, ancak "filtrelenmiş dizi:" boş, "olaylar:" boş, "events.self.count:" = 0, searchBarText boş, kendiliğinden .events.count = 0.Arama Çubuğu İptal Düğmesi orijinal tablo görünümünü ve verilerini tekrar yüklemiyor

EventViewController.h dosyası:

#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 dosyası: searchBarCancelButtonClicked içinde

#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 

cevap

1

işlevi iptal etmemelidir, bu yüzden aşağıda belirtilen satırları çalıştırmamalısınız, bu nedenle self.searchController.searchBar.text uzunluğunu kontrol edebilir veya iptal tıklatılıp tıklanmadığını veya metin girilip girilmediğini kontrol etmek için bir boole ayarlayabilirsiniz. text alanı

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

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

Wow - teşekkürler! Daha önce böyle bir şey denedim, ama kontrol ettiğim yanlış kombinasyon vardı. Şimdi bunu searchBarCancelButtonClicked'de yaptım: self.searchController.searchBar.text = @ ""; ve updateSearchResultsForSearchController içinde ((self.searchController.searchBar.text.length> 0)) Eğer listelediğiniz iki satır olmadan tüm rutinini gerçekleştirdim ve işe yaradı! Çok teşekkürler! Sadece bir soru daha - Herhangi bir sonuç bulunamazsa, boş tablo görünür, ancak "eşleşme bulunamadı" ifadesi de belirtilmelidir? Size nasıl oy vereceğinize bakacağım! – RG123

+0

evet, eşleşme bulunamadı, en kolay yoldan 'hiçbir eşleşme bulunamadı' görünümünde bir etiket yerleştirebilir ve dizi sayısı 0 olduğunda tablo görünümünü gizleyebilir ve etiketi gösterebilir ve sayımı tablo görünümünü gösterebilir ve etiketi gizleyebilirsiniz – HardikDG

+0

Eğer bu cevap cevabı doğru olarak işaretleyebilmenize yardımcı oluyorsa, cevabın sol tarafındaki sayımın yanındaki yukarı oku tıklatarak yapabileceğiniz en yüksek puan için, ancak sadece 15 rep daha fazla ref var: http: //meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – HardikDG

0

self.searchController.active = eklemek HAYIR; özellik ekleme .h

yılında

viewDidLoad

@property (strong, nonatomic) UISearchController *searchController; 

UISearchBarDelegate, kodda arama denetleyicisi oluşturma Ekle film şeridi

içinde herhangi bir arama denetimlerini düşürmeyin

reloadData

önce önce
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

Öneriniz için teşekkür ederiz, ama işe yaramadı. – RG123

+0

İzlemimin sonuçlarını postama sonuna ekledim. Ayrıca, Storyboard'da Search Bar ve Search Display Controller nesnesini kullandım - bunun benim sorunuma katkıda bulunup bulunmayacağını merak ediyorum. Gerekirse bağlantıların resimlerini ekleyebilirim. Ben yeni başlayan biriyim ve gerçekten sıkışıp kaldım. Teşekkür ederim. – RG123

İlgili konular