0

9つのUIImageViewを表示するアプリがあり、ユーザーがそれらを削除する機能を追加しています。インターフェイスビルダーでのタグの使用に問題があることを除いて、コードは正常に機能します。私のコードは、配列内の位置に基づいてImageView内の画像を削除しているようです。したがって、 UIImageViewが3つある場合は、最初のUIImageViewsタグを1に設定し、2番目の画像ビューのタグを2に設定し、3番目を3に設定します。 キャッチされない例外NSRangeException、理由: * '-[__ NSArrayM removeObjectAtIndex:]:境界を超えたインデックス3 [0 .. 1] '

これは私が使用しているコードです:

    - (IBAction)deleteButtonPressed:(id)sender {
    NSLog(@"Sender is %@", sender);
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete"
                                                              message:@"Are you sure you want to delete this photo?"
                                                             delegate:self
                                                    cancelButtonTitle:@"No"
                                                    otherButtonTitles:@"Yes", nil];
    [deleteAlertView show];
    int imageIndex = ((UIButton *)sender).tag;
    deleteAlertView.tag = imageIndex;

}

- (void)alertView: (UIAlertView *) alertView 
clickedButtonAtIndex: (NSInteger) buttonIndex
{


    if (buttonIndex != [alertView cancelButtonIndex]) {
        NSLog(@"User Clicked Yes. Deleting index %d of %d", alertView.tag, [array count]);
        NSLog(@"The tag is %i", alertView.tag);
        [self.array removeObjectAtIndex: alertView.tag];
        NSLog(@"After deleting item, array count  = %d", [array count]);
    NSLog(@"Returned view is :%@, in view: %@", [self.view viewWithTag:alertView.tag], self.view);
        ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil;
    }

    [self.user setObject:self.array forKey:@"images"];
}

最初の画像を配列の0インデックスに配置する必要がありますが、0のタグはデフォルトのタグであるため、設定できないことはわかっています。したがって、この問題を回避する方法がわかりません。どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

2

インデックス番号としての静的タグはこれには機能しないと思います。最初の削除でうまくいったとしても、最後の配列要素ではないものを削除すると、タグと配列オフセットの一致が変わるからです。

配列をステップスルーして、一致するタグを持つアイテムを返すメソッドを作成することをお勧めします。または、タグを介して直接アクセスする場合は、辞書を使用し、タグを使用してキーを作成します。

タグ マッチングのコードは次のようになります。

- (UIImageView *)viewForTag:(NSInteger)tag {
    UIImageView *found = nil;
    for (UIImageView *view in self.array) {
        if (tag == view.tag) {
            found = view;
            break;
        }
    }
    return found;
}

- (void)alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex {
    // ...

    // Replacing: [self.array removeObjectAtIndex: alertView.tag];
    UIImageView *view = [self viewForTag:alertView.tag];
    if (view) {
        [self.array removeObject:view];
    }

    // ...
}
于 2012-04-05T18:40:14.677 に答える