0

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
4

1 に答える 1

0

問題は、JSON から読み込んでいるオブジェクトの一部に、NSString ではなく NSNull であるタイトルがあることです。textDidChange: メソッドに NSNull のチェックを追加すると、問題が解決するはずです。

if(![sTitle.name isKindOfClass:[NSNull class]])
{
    NSRange titleRange = [sTitle.name rangeOfString:text options:NSCaseInsensitiveSearch];

    if(titleRange.location != NSNotFound)
    {
        [filteredTableData addObject:sTitle];
    }
}

または、retrieveData メソッドで NSNull タイトルを使用して曲を除外することもできます。

于 2014-04-01T15:16:13.507 に答える