【问题标题】:How to refresh view in objective-c如何在objective-c中刷新视图
【发布时间】:2011-12-16 12:11:33
【问题描述】:

我想创建一个画廊。它根据用户选择的类别加载不同的图像。我曾经在 UIImageViews 中填充图像。

我在选择不同类别时不会清除之前选择的图像。这是我用于填充图像的代码。

-(void)refresh{

   categoryLabel.text = treatment.treatmentName;
   NSMutableArray  *galleryImages =[NSMutableArray alloc] ;
   galleryImages = [[PatientImage alloc]find:treatment.treatmentId];

   int imgCount = [galleryImages count];

    for(int i=0;i<imgCount;i++){

        PatientImage *apatientImage = [galleryImages objectAtIndex:i]; 

        UIImage *img1 = [UIImage imageNamed:apatientImage.imageBefore]; 
        UIImageView *myImageView = [[UIImageView alloc] initWithImage:img1];
        myImageView.contentMode = UIViewContentModeTopRight;
        myImageView.frame = CGRectMake(120+i*240,120.0,100.0, 100.0);
       [self.view addSubview:myImageView];

        UIImage *img2 = [UIImage imageNamed:apatientImage.imageAfter]; 
        UIImageView *myImageView2 = [[UIImageView alloc] initWithImage:img2];
        myImageView2.contentMode = UIViewContentModeTopRight;
        myImageView2.frame = CGRectMake(120+i*240+300,120.0,100.0, 100.0);
        [self.view addSubview:myImageView2];
    }
}  

【问题讨论】:

  • 不回答你的问题,让我做一点代码审查:-):[[PatientImage alloc]find:treatment.treatmentId]; 对我来说看起来很奇怪。您的 find 方法是否初始化了一个对象?更好的编码风格是拥有一个具有图像属性的Patient 对象:UIImage *patientImage = [[Patient alloc]initWithTreatmentId:treatment.treatmentId].patientImageallocinit* 也应该永远在一起。或者,您可以像这样获得自动释放的对象:[NSMutableArray array]

标签: objective-c image ipad uiimageview


【解决方案1】:

首先,你有一些内存泄漏。在将 UIImageViews 添加到视图后,您正在分配 UIImageViews 但不会在任何地方释放它们。不过,我不知道这是否适用于 ARC。这同样适用于您的 Mutable 数组,但我想您是在某处的“for”循环之后释放它,因为您似乎在省略了一些代码后发布了代码。

就您的实际问题而言,我不会这样做。我会将可变数组设为对象变量,然后用我的图像视图填充它。再次调用刷新时,我会首先在每个图像视图上调用 -removeFromSuperview,然后清空数组,然后重新填充它并将新的子视图添加到我的视图中。这是最简单的方法。

我不知道您是否在使用 ARC,但是在使用动态加载的视图时应该注意内存管理。每次将视图添加到另一个视图时,都会增加其保留计数器。然后,您必须调用 release 来移除所有权,并让 iOS 运行时处理其余部分。

还要注意,像这样使用视图的操作在内存方面是昂贵的。因此,另一种重新填充图库视图的方法是仅更改 imageView 保存的图像。这将为您节省一些内存和时间。如果视图没有要显示的固定数量的图像,您可以改进算法以更改已创建的图像视图上的图像,然后在必要时添加更多图像视图或删除剩余的图像视图(如果有)。

希望我能帮上忙。

【讨论】:

  • 我是 Objective-c 的新手。可能有很多错误。感谢您提出宝贵的意见。
  • 既然您是新手,而且这是 iOS 内存管理(或至少是前端)的变革季节,我认为您应该首先阅读 ARC(自动引用计数)。我知道你可能渴望继续你的项目,但至少你应该确保你知道你的项目是否使用 ARC。在收到论坛成员的回复时,仅提及这些信息可以节省您很多时间,因为您以后可能会遇到根源于内存管理的问题。祝你好运。
【解决方案2】:

在刷新调用开始时尝试

    [[self subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];

    for (id imageView in self.subviews){
            if([imageView isKindOfClass:[UIImageView class]]) [imageView removeFromSuperview];
    }

【讨论】:

  • 更改图像而不是删除 UIImages 然后重新添加它们不是更好吗?
  • 第一种方法将从当前视图中删除所有子视图,如果您有比 UIImageViews 更多的子视图(如滚动视图和按钮),这可能不是您想要的。第二个增加了一点清晰度,而且要好得多,但我仍然更喜欢 NSMutableArray 作为一个对象变量,它保存要删除的 UIImageViews。
  • 您能否为此目的发布经过编辑的代码@ChristosSotiriou,
  • 假设 imageViews 是 NSMutableArray 类型的对象属性,之前已经初始化:codeviewer.org/view/code:2155
【解决方案3】:
call [tableview reloadData] if You are using tableview to show your gallery images 
or call view's 
[self.view setNeedsDisplay] method for refreshing the view.

【讨论】:

  • 我已将 setNeedsDisplay 代码放在刷新函数的开头。但它没有用。我不知道是写它的地方。谢谢。
  • setNeedsDisplay 不起作用。 setNeedsDisplay 用于 UIView 特定的操作。如果您有一个自定义视图子类,其中覆盖了 -drawRect,那么调用 setNeedsDisplay 将根据 -drawRect 刷新视图。但是,您所描述的情况并非如此。使用刷新功能释放预览视图并分配新视图。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 2016-01-28
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多