26

私のアプリケーションには、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 オブジェクトを挿入しようとしています'

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

何か案は?

4

2 に答える 2

14

これが発生する可能性のある場所が少なくとも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。たとえば、あなたの場合、まだ1または2の値に設定されていないnil場合clickedButton.tagは、作成している配列を渡します。問題の診断に役立つ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");
}
于 2012-08-13T13:48:57.007 に答える
2

これはすべて非常に複雑ですが、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 倍であると言っていますが、それは意図的なものだと思います。

于 2012-08-13T13:25:45.937 に答える