web-dev-qa-db-ja.com

objects [0]からnilオブジェクトを挿入しようとしますか?

私のアプリケーションには、UITableViewと、ユーザーがNSDateまたはintに基づいた順序に配列を並べ替えるためにクリックできるいくつかのボタンがあります。だから、これは私のUITableViewをソートしようとする私の方法です:

- (void)sortStats:(id)sender reloadData:(BOOL)dataBool {
    NSSortDescriptor *descriptor = nil;
    UIButton *clickedButton = (UIButton*)sender;
    if (clickedButton.tag == 1) {
            descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
    }
    [self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    [[NSUserDefaults standardUserDefaults] setObject:self.cellArray forKey:@"cellArray"];
    if (dataBool) {
        [ivstatstableView reloadData];
    }
    [ivstatstableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}

したがって、UITableViewのreloadDataがクラッシュを引き起こしているように見えたため、元々はreloadDataパラメータなしでこのメソッドを使用していました。

これは、コンソールクラッシュログの内容です。

キャッチされない例外 'NSInvalidArgumentException'によるアプリの終了、理由: '***-[__ NSPlaceholderArray initWithObjects:count:]:オブジェクト[0]からnilオブジェクトを挿入しようとしました'

とにかく、このクラッシュを引き起こすコードがありますか?私は本当にこの機能を自分のアプリで機能させたいと思っており、修正に近づいていることは知っていますが、この問題の原因はわかりません。

何か案は?

21
SimplyKiwi

これが起こる可能性のある場所が少なくとも1つあり、おそらく他にもあります。ユーザーのデフォルトの内容を取得するコードでは、nilをチェックしません。したがって、これの代わりに:

[self.cellArray addObjectsFromArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"array"]];

あなたはこれを試してみたいかもしれません:

NSArray *defaultCellArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"array"];
if (defaultCellArray) {
    [self.cellArray addObjectsFromArray:defaultCellArray];
}

(エラーメッセージに応じて)失敗しているinitWithObjects呼び出しが、別の呼び出し(おそらくこの呼び出し)内にネストされている可能性もあります。

[self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];

完全なコールスタックを見ると、このコールがinitWithObjectsへの後続のコールを行い、場合によってはnilを渡すかどうかがわかります。たとえば、あなたの場合、nil yoを作成すると、clickedButton.tagはまだ1または2の値に設定されていません。問題の診断に役立つelse句を追加することができます。

if (clickedButton.tag == 1) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
} else if (clickedButton.tag == 2) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Score" ascending:NO];
} else {
    NSLog(@"Unexpected error: Can't determine sort descriptor");
}
11
Tim Dean

これはすべてかなり複雑ですが、1つのことは突き出ています。

[[NSUserDefaults standardUserDefaults] setObject:self.cellArray 
                                          forKey:@"cellArray"];

これを次のように変更する必要があると思います。

NSArray *array = [NSArray arrayWithArray:self.cellArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"cellArray"];

次に、オブジェクトがあるべきだと思うすべての場所の後にasserts()を追加します。

UIButton *theButton = ...
assert(theButton);

また、行数はcellArrayカウントの2倍であると言っていますが、これは意図的なものだと思います。

2
David H