【问题标题】:Close a series of views in a for-loop [iPhone]在 for 循环中关闭一系列视图 [iPhone]
【发布时间】:2010-09-22 21:16:02
【问题描述】:

我需要关闭一系列视图,并且不会编写代码来逐个关闭它们。这是一个示例代码来说明我的意思:

//这是放置视图的方法。它在运行时的不同时间被调用:

- (void)addNotePic:(int)number {

int indexNumber = ((110*number) + 10);

UIImage *image = [UIImage imageNamed:@"Note.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage: image];
[image release];
imageView.frame = CGRectMake(10, indexNumber, 300, 100);
imageView.tag = 100 + number;
[self.view addSubview: imageView];
[self.view sendSubviewToBack: imageView];
[imageView release];

}

//这里是问题部分,也是我要问你们的事情。这是我希望一次删除所有显示的视图的方法。

    for (i = 0; i < 20; i++) {
    UIView *imageView = [self.view viewWithTag:100 + i];
    [imageView removeFromSuperview];
}

我知道这会导致错误,因为我尝试在 imageView 第二次循环时重新定义它,但是我该如何解决这个问题。可能是将名称“imageView”重命名为“imageView + i”或更聪明的东西。希望有个好建议...

【问题讨论】:

  • 您的问题不在于变量imageView 被重新定义,这是完全合法的。您是否在控制台中收到错误消息?您是否在调试器中逐步完成了此操作?它在做你认为的那样吗?错误来自哪一行?肯定有带有标签 100..119 的视图吗?
  • -1。变量不是那样工作的。你的代码很好。
  • 控制台消息是:程序接收信号:“EXC_BAD_ACCESS”。查了一下,内存管理不好。通过在创建后不释放视图来解决整个问题。不是最好的方法,但它现在可以解决它......

标签: iphone cocoa-touch loops uiview uikit


【解决方案1】:

我承认我只是在快速猜测,但这行得通吗?

    for (i = 0; i < 20; i++) {
    [[self.view viewWithTag:100 + i] removeFromSuperview];
}

【讨论】:

  • 我想我昨晚试过了,但它似乎没有正确地定位视图。等我回家再试试……
【解决方案2】:

以下将从 self.view 中删除 所有 UIImageViews。请注意,可变数组是必需的,因为您无法修改正在迭代的数组(如在 for 循环中)

NSMutableArray *removeThese = [NSMutableArray arrayWithCapacity:5];

for (UIView *view in self.view.subviews) {
 if([view isKindOfClass:[UIImageView class]]) {
  // [view removeFromSuperview]; <-- This will result in a runtime error
  [removeThese addObject:view];
 }
}

[removeThese makeObjectsPerformSelector:@selector(removeFromSuperview)];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2019-04-14
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多