2013-03-20 85 views
0

xcode新手想要獲取UISearchBar功能。無法獲取UISearchBar代碼工作

我正在使用故事板和我的tableview控制器在數組json的單元格中顯示事件列表(標題,位置&開始日期)。當表格第一次加載時,我的所有結果都顯示正常。當我點擊將一些文本放入搜索欄(標題中存在的文本)時,視圖控制器中不顯示任何內容(即,它將所有事件過濾掉)。希望這樣做更有意義。

我的頭文件是

#import <UIKit/UIKit.h> 

#define kGETUrl @"http://www.max-momentus.com/fetchevents.php5" 

@interface MMAllEventsViewController : UITableViewController <UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource> { 
    NSMutableArray *json; 
    NSMutableArray *jsonFiltered; 
    BOOL isFiltered; 
} 

@property (weak, nonatomic) IBOutlet UISearchBar *eventSearchBar; 
@property (strong, nonatomic) IBOutlet UITableView *eventTableView; 

@property (strong, nonatomic) NSString *categorySelected; 
@property (strong, nonatomic) NSString *displayDate; 

@end 

我的執行文件是

#import "MMAllEventsViewController.h" 
#import "MMEventDetailViewController.h" 
#import "MMCategoryViewController.h" 
#import "MMEventCell.h" 

@interface MMAllEventsViewController() 

@end 

@implementation MMAllEventsViewController 

@synthesize categorySelected, displayDate; 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"EventDetailSegue"]) { 

     // Segue code 
    } 
} 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

-(void) getData:(NSData *) data { 

    NSError *error; 

    json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
    [self.tableView reloadData]; 
} 

-(void) start { 

     NSURL *url = [NSURL URLWithString:kGETUrl]; 
     NSData *data = [NSData dataWithContentsOfURL:url]; 
     [self getData:data]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.eventSearchBar.delegate = self; 
    self.eventTableView.delegate = self; 
    self.eventTableView.dataSource = self; 

    [self start]; 

} 

-(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if (searchText.length == 0) { 
     isFiltered = NO; 
    } 
    else { 
     isFiltered = YES; 
     for (int i = 0; i < [json count]; i++) 
     { 
      NSMutableDictionary *temp = (NSMutableDictionary*) [json objectAtIndex:i]; 
      NSString *name = [NSString stringWithFormat:@"%@", [temp valueForKey:@"Title"]]; 
      NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      if(r.location != NSNotFound) 
      { 
       [jsonFiltered addObject:name]; 
      } 
      i++; 
     } 
    } 
    [self.eventTableView reloadData]; 

} 

-(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [self.eventTableView resignFirstResponder]; 
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    if (isFiltered) { 
     return [jsonFiltered count]; 
    } 
    return [json count]; 

} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"EventCell"; 
    MMEventCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[MMEventCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell... 
    if (!isFiltered) { 
     NSDictionary *info = [json objectAtIndex:indexPath.row]; 

     cell.eventTitleLabel.text = [info objectForKey:@"Title"]; 
     cell.locationLabel.text = [info objectForKey:@"Location"]; 

     NSString *startDate = [info objectForKey:@"StartDate"]; 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
     NSDate *sdate = [dateFormatter dateFromString:startDate]; 
     [dateFormatter setDateFormat:@"EEE, d MMM yy"]; 
     NSString *convertedStartDate = [dateFormatter stringFromDate:sdate]; 

     NSString *endDate = [info objectForKey:@"EndDate"]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
     NSDate *edate = [dateFormatter dateFromString:endDate]; 
     [dateFormatter setDateFormat:@"EEE, d MMM yy"]; 
     NSString *convertedEndDate = [dateFormatter stringFromDate:edate]; 

     if([sdate isEqualToDate:edate]) { 
      displayDate = convertedStartDate; 
     } else { 
      displayDate = [convertedStartDate stringByAppendingString:@" to "]; 
      displayDate = [displayDate stringByAppendingString:convertedEndDate]; 
     } 

     cell.datesLabel.text = displayDate; 
    } 
    else { 
     NSDictionary *info = [jsonFiltered objectAtIndex:indexPath.row]; 

     cell.eventTitleLabel.text = [info objectForKey:@"Title"]; 
     cell.locationLabel.text = [info objectForKey:@"Location"]; 

     NSString *startDate = [info objectForKey:@"StartDate"]; 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
     NSDate *sdate = [dateFormatter dateFromString:startDate]; 
     [dateFormatter setDateFormat:@"EEE, d MMM yy"]; 
     NSString *convertedStartDate = [dateFormatter stringFromDate:sdate]; 

     NSString *endDate = [info objectForKey:@"EndDate"]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
     NSDate *edate = [dateFormatter dateFromString:endDate]; 
     [dateFormatter setDateFormat:@"EEE, d MMM yy"]; 
     NSString *convertedEndDate = [dateFormatter stringFromDate:edate]; 

     if([sdate isEqualToDate:edate]) { 
      displayDate = convertedStartDate; 
     } else { 
      displayDate = [convertedStartDate stringByAppendingString:@" to "]; 
      displayDate = [displayDate stringByAppendingString:convertedEndDate]; 
     } 

     cell.datesLabel.text = displayDate; 
    } 
    return cell; 
} 

@end 
+1

這裏有什麼問題? – Balu 2013-03-20 10:29:54

+1

請對你面臨的問題更具體一點 – 2013-03-20 10:30:47

+0

你其實並沒有問我們任何問題。你的問題是什麼? – Popeye 2013-03-20 10:32:34

回答

0

你是否確信你有代表:在您的視圖控制器的.h文件?此外,請確保您已從故事板中選擇「UISearchBar和UISearchDisplay控制器」作爲搜索欄對象(假設您正在使用故事板)。請確保您已將自己的搜索欄有您的視圖控制器是其代表,以及它連接到一個IBOutlet對象在你的代碼(同樣,假設你使用故事板:

@property (strong, nonatomic) IBOutlet UISearchBar *searchBar; 

最後,請您已經申報了UISearchDisplayController變量,它鏈接到你的的UITableView,然後加載從搜索結果時,在你的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

- (NSInteger)numberOfRowsInTableView:(UITableView *)tableView 
檢查確保

如果:

if(tableView == searchDisplay): 
{ 
     ...load results. 
} 
else 
{ 
     ...load normal view 
} 
+0

嗨,我很確定我已經完成了你在回答中提到的所有內容,我添加了我的頭文件和實現文件代碼。如果你不介意看看,我會非常感激。謝謝。 – user2033055 2013-03-20 17:39:40