【问题标题】:How to load two images in a View in objective c?如何在目标 c 的视图中加载两个图像?
【发布时间】:2013-01-24 01:02:58
【问题描述】:

我是 Objective c 和 Xcode 的新手。我发现这段代码允许我从一个 url 将图像加载到我的设备中,并将其替换为我在与包含此代码的类关联的视图中拥有的一个。现在我需要在同一个类中加载两个图像,以替换在同一个视图中的两个图像...我怎么能?

编辑:要清楚:我有一个包含两个图像视图的视图。每个图像视图都显示包含在应用程序资源中具有特定名称的文件中的图像。假设第一个图像视图包含“image1.jpg”和第二个“image2.jpg”。我想要做的是将两个图像“image1.jpg”和“image2.jpg”替换为从网络上获取的两个图像(为了在应用程序期间最终更新一些应用程序图像)生活中使用了 xml,等等)。

- (void)loadImgFromURLString: (NSString *)theUrlString{
    NSLog(@"Downloading image...");
    backgroundHome.image = nil;    

    NSURLRequest *request = [NSURLRequest requestWithURL:
                        [NSURL URLWithString:theUrlString]
                         cachePolicy:NSURLRequestReturnCacheDataElseLoad
                        timeoutInterval:30.0];
    connection = [[NSURLConnection alloc]
              initWithRequest:request delegate:self];
 }

 - (void)connection:(NSURLConnection *)theConnection
     didReceiveData:(NSData *)incrementalData {
    if (data == nil)
        data = [[NSMutableData alloc] initWithCapacity:2048];

    [data appendData:incrementalData];
 }

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection{
    backgroundHome.image = [UIImage imageWithData:data];
    NSLog(@"Image ready...");

    // save image in document dir
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *pngFilePath = [NSString stringWithFormat:@"%@/test.png",docDir];
    [data writeToFile:pngFilePath atomically:YES];
}

【问题讨论】:

  • akv 为什么评论这两个函数?
  • 这两个函数只用于gettng字符串...
  • 所以你需要用新的一张替换现有的两张图片吗?
  • 获取字符串?你能解释一下吗?
  • 抱歉,从 url 获取图片。

标签: iphone objective-c image cocoa


【解决方案1】:

在视图中添加第二张图像不是我想的真正问题?

如果有多个图像,您的要求是将加载的数据分配给适当的图像。

您可以将此代码添加到 UIImageView 的子类中。这样做每个 UIImageView 都会创建自己的请求并接收自己的图像数据。最终你将它分配给 self.image = ...

这就是我会做的。

替代方案: 您创建一个引用 UIImageView 的图像加载器类。其中您创建两个实例。每个实例都“知道”自己的 UIImageView 并发出请求,最终将图像数据保存到自己的 UIImageView 中。

下一个替代方案(我从未尝试过)

NSMutableDictionary ongoingRequests = [[NSMutableDictionary alloc] init];

- (void)loadImgFromURLString: (NSString *)theUrlString forImageView:(UIImageView)theView {
    backgroundHome.image = nil;    

    NSURLRequest *request = [NSURLRequest requestWithURL:
                        [NSURL URLWithString:theUrlString]
                         cachePolicy:NSURLRequestReturnCacheDataElseLoad
                        timeoutInterval:30.0];
    connection = [[NSURLConnection alloc]
              initWithRequest:request delegate:self];

    [self.ongoingRequests setObject:theView forKey:connection]
 }

[...]

- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection{
    UIImageView *theView = [self.ongoingRequests objectWithKey:theConnection]
    theView.image = [UIImage imageWithData:data];
    self.ongoingRequests removeObjectForKey:theConnection;

    // save image in document dir
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/test.png",docDir];
[data writeToFile:pngFilePath atomically:YES];
}

【讨论】:

  • 我猜 AKV 正试图告诉我同样的事情,但我无法得到它。我总是将一个类与一个类相关联......我该如何参考它,应用程序的屏幕(或框架?我的意思是情节提要的一个框架,你知道吗?)在他的 iboutlet 内部代表 imageview 等等......所以,你告诉我我可以将一个新类关联到一个图像视图那是在应用程序的框架内吗?我该怎么办?
  • 当然可以。只是 UIImageView 的子类。然后在 IB 中添加一个 UIImageView。 (你可能已经有了它们)然后将 IB 中的类更改为你的子类。但是,如果您不想继承 UIImageView 的子类,则可以扩展它。如果您甚至不想扩展它,那么我提供了两个替代方案,它们无需对 UIImageView 本身进行维护。
  • 感谢您的接受。您选择了哪些替代方案?
  • 对我自己感到羞耻,我通过一次糟糕的锻炼解决了这个问题:在三个函数的第一个循环结束时,我使用不同的数据再次重复该函数,作为重复一遍,一个 bool 全局变量……我太着急了!但我仍在努力让事情以正确的方式进行,我仍然认为这是你的。我试图创建两个类来操作这两个图像的两个图像视图,但是我仍然找不到正确的代码来在主视图出现时执行加载......这个力的方式仍然很长年轻的 Xcode 学徒!
  • 好的。是的,序列化请求当然是一种选择。我曾经为相同的资源自己做过一次。当时我也需要一个快速的解决方案并使用了这个解决方法。当视图控制器请求资源(jpeg 图像)而对同一图像的旧请求仍在进行时,我的应用程序崩溃了。
【解决方案2】:

在主视图中创建两个子视图。

在它们上加载图像,并根据需要进行操作。

这对你来说会更容易。

【讨论】:

  • 我有两个子视图,但我不知道如何做其余的 ^^'
  • 特别是通过三个函数 loadImgFromURLString - connection - connectionDidFinishLoading 我失去了对谁被加载的控制。想象一下,我已经使用两个不同的 url 执行了函数 loadImgFromURLString 两次...到达了 connectionDidFinishLoading 的末尾,我如何在 [NSString stringWithFormat:@"%@/test.png" 行中填充文件名,docDir]?那时我不知道这两个函数中的哪一个正在执行connectionDidFinishLoading。我希望你能明白我的问题...
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多