0

我有一个显示 9 个 UIImageViews 的应用程序,并且我正在添加用户删除它们的功能。该代码工作正常,除了我在界面生成器中使用标签时遇到一些问题。似乎我的代码根据其在数组中的位置删除了 ImageView 中的图像。所以,如果我有 3 个 UIImageViews,我会将第一个 UIImageViews 标记设置为 1,第二个图像视图的标记设置为 2,第三个设置为 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 回答