Json データ テーブルに UISearchBar オプションを実装しました。ただし、検索しようとすると、プログラムがクラッシュします。これに関するヘルプを高く評価します。
私のテーブルビューコントローラーのヘッダーと実装ファイルを以下に示します
ヘッダーファイル。
#import <UIKit/UIKit.h>
@interface byTitleViewController : UITableViewController
@property (nonatomic, strong) NSMutableArray * jsonArray;
@property (nonatomic, strong) NSMutableArray * songsArray;
@property (strong, nonatomic) NSMutableArray* filteredTableData;
- (void) retriveData;
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
@property (nonatomic, assign) bool isFiltered;
@end
実装ファイル
#import "byTitleViewController.h"
#import "songs.h"
#define getDataURL @"http://fetchpin.com/byTitle.php"
@interface byTitleViewController ()
@end
@implementation byTitleViewController
@synthesize jsonArray, songsArray, filteredTableData, searchBar, isFiltered;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"By Title";
searchBar.delegate = (id)self;
[self retriveData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSUInteger rowCount;
if(self.isFiltered)
rowCount = filteredTableData.count;
else
rowCount = songsArray.count;
return rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
songs* songlist;
if (isFiltered) {
songlist = [filteredTableData objectAtIndex:indexPath.row];
}else{
songlist = [songsArray objectAtIndex:indexPath.row];
}
cell.textLabel.text = songlist.songTitle;
return cell;
// Configure the cell...
/*songs * songObject;
songObject = [songsArray objectAtIndex:indexPath.row];
cell.textLabel.text = songObject.songTitle;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
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;
}
- (void) retriveData{
NSURL * url = [NSURL URLWithString:@"http://fetchpin.com/byTitle.php"];
NSData * data = [NSData dataWithContentsOfURL:url];
jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
songsArray = [[NSMutableArray alloc] init];
for (int i = 0; i < jsonArray.count; i++) {
NSString * sId = [[jsonArray objectAtIndex:i] objectForKey:@"id"];
NSString * sTitle = [[jsonArray objectAtIndex:i] objectForKey:@"title"];
[songsArray addObject:[[songs alloc]initWithSongTitle: sTitle andSongID: sId]];
}
//[self.tableView reloadData];
}
//search bar ...
-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
if(text.length == 0)
{
isFiltered = FALSE;
}
else
{
isFiltered = true;
filteredTableData = [[NSMutableArray alloc] init];
for (songs * sTitle in songsArray)
{
NSRange titleRange = [sTitle.songTitle rangeOfString:text options:NSCaseInsensitiveSearch];
if(titleRange.location != NSNotFound)
{
[filteredTableData addObject:sTitle];
}
}
}
[self.tableView reloadData];
}
@end