线程1:信号SIGABRT

时间:2016-02-12 16:31:10

标签: ios objective-c uitableview plist

我是一个非常新的Objective.I我正在尝试创建一个简单的应用程序,并在添加更多视图后,我得到此错误“线程1信号SIGABRT”和应用程序将无法在iOS模拟器中打开。错误指向这行代码:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

我之前尝试过搜索,但我不明白其他答案在谈论什么。

NamesTableViewController.h是:

#import <UIKit/UIKit.h>


@interface NamesTableViewController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate>


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

@end

NamesTableViewController.m是:

#import "NamesTableViewController.h"

@interface NamesTableViewController ()
@property (nonatomic, copy) NSDictionary *propertyList;
@property (nonatomic, copy) NSArray *letters;
@property (nonatomic, copy)NSMutableArray *filteredNames;
@property (nonatomic, strong)UISearchController *searchController;


@end

    @implementation NamesTableViewController

    @synthesize propertyList,  letters, filteredNames, searchController;

    - (void)viewDidLoad {
        [super viewDidLoad];

        UITableView *tableView = (id)[self.view viewWithTag:1];

        [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

        filteredNames = [[NSMutableArray alloc]init];
        searchController = [[UISearchController alloc]init];


        self.searchController.searchResultsUpdater = self;

        NSString *path = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"plist"];
        self.propertyList = [NSDictionary dictionaryWithContentsOfFile:path];
        self.letters = [[self.propertyList allKeys] sortedArrayUsingSelector:@selector(compare:)];
    }

    #pragma mark - Table view data source

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (tableView.tag == 1){

            return self.letters.count;

        }else {
            return 1;
        }

        }

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

        if (tableView.tag == 1) {

            NSString *letter = self.letters[section];
            NSArray *keyValues = [self.propertyList[letter] allKeys];
            return keyValues.count;
        } else {


            return [filteredNames count];
        }
    }


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        // Configure the cell...

        if (tableView.tag == 1){

            NSString *letter = self.letters[indexPath.section];;
            NSArray *keyValues = [[self.propertyList[letter] allKeys] sortedArrayUsingSelector:@selector(compare:)];
            cell.textLabel.text = keyValues[indexPath.row];
        } else{
            cell.textLabel.text = filteredNames[indexPath.row];
        }
        return cell;
    }

    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return self.letters;
    }

    -(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

        if (tableView.tag == 1) {
            return letters [section];
        } else {
            return nil;
        }
    }

    #pragma mark Search Display Delegate Methods

    -(void)searchDisplayController:(UISearchController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
        [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    }



    -(BOOL)searchDisplayController:(UISearchController *)controller shouldReloadTableForSearchString:(NSString *)searchString

    {

        [filteredNames removeAllObjects];
        if (searchString.length > 0) {
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [search] %@", self.searchBar.text];

            for (NSString *letter in letters) {
                NSArray *matches = [[self.propertyList[letter] allKeys]filteredArrayUsingPredicate:predicate];

                [filteredNames addObjectsFromArray:matches];

            }

        }

        return YES;
    }

    @end

如果您想了解更多信息,只需通过答案向我说出来,我就会编辑我的问题然后您将编辑您的答案

1 个答案:

答案 0 :(得分:0)

[keys allKeys]返回单级数组。因此,只能有一个部分。

修改

为了更好地理解和提高可读性,我将names替换为letters,将keys替换为propertyList

•.h

方法numberOfRowsInSectioncellForRowAtIndexPath检索分区字母,然后从属性列表中检索相应的密钥。

作为数据源的字典不是最佳选择,因为有许多重复性任务要执行,例如排序。最好在viewDidLoad

中创建一个嵌套数组作为数据源
@interface NamesTableViewController ()
@property (nonatomic, copy) NSDictionary *propertyList;
@property (nonatomic, copy) NSArray *letters;

@end

•。m

@implementation NamesTableViewController

@synthesize propertyList, letters;

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"plist"];
    self.propertyList = [NSDictionary dictionaryWithContentsOfFile:path];
    self.letters = [[self.propertyList allKeys] sortedArrayUsingSelector:@selector(compare:)];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.letters.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *letter = self.letters[section];
    NSArray *keyValues = [self.propertyList[letter] allKeys];
    return keyValues.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    NSString *letter = self.letters[indexPath.section];
    NSArray *keyValues = [[self.propertyList[letter] allKeys] sortedArrayUsingSelector:@selector(compare:)];
    cell.textLabel.text = keyValues[indexPath.row];
    return cell;
}

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return self.letters;
}

@end