开发者

iOS load an image based on user input

开发者 https://www.devze.com 2023-03-23 20:04 出处:网络
fairly new to Objective-C and iOS development (coming from PHP) and I have a relatively simple question that I can\'t seem to find an answer to:

fairly new to Objective-C and iOS development (coming from PHP) and I have a relatively simple question that I can't seem to find an answer to:

I am following along with an example for split View design where a web page is loaded into the Detail View when a user clicks an item in the master view. I got all this working, but would like to substitute web view for an image. So I've amended the app to load a UIImage instead of a WebView. What I'm looking for is the equivalent to this code:

NSString *urlString = [pagesAddress objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:urlString];

// these 2 is where I get lost with the images.
NSURLRequest = *request = [NSURLRequest requestWithURL:url];
[detailViewController.webView loadRequest:request];

I came up with this:

NSString *imageName = [pagesAddress objectAtIndex:indexPath.row];
UIImage *myImage = [UIImage imageNamed:imageName];

// missing the last 2 calls: one to tell Xcode that it's an image "request" I want and the second to load the actual image (based on it's name that is already in an array) into the ImageView.

Thanks.

PS

I tried this:

NSString *imageName = [pagesAddress objectAtIndex:indexPath .r开发者_如何转开发ow];
[detailViewController.imageView setImage:[UIImage imageNamed:imageName]]; 

And it shows just the first image, then crashes when I try to show the last one.


In the end, the solution were those 2 lines when I amended the code:

NSString *imageName = [pagesAddress objectAtIndex:indexPath.row];
[detailViewController.imageView setImage:[UIImage imageNamed:imageName]];

Notice that I had to change the setImage to convert the NSString to a UIImage or Xcode would complain. It turns out it was crashing because in the array where I had the image names, I had put 3 images into one entry (basically I forgot the commas!) so it was out of range.

Tim:

This line you gave me

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

is unnecessary because I already have a view created, it would create another view which I never used. Also, replacing it with CGRect seems overkill if I already have a UIImage placeholder no?

In any case, it works now and I'm very grateful for all the help. iPad development with Objectve-C is a very thorny road and I expect I'll be bugging you guys some more.

Cheers.


Try this:

UIImage *myImage = [[UIImage alloc] initWithData:[NSData dataWithConentsOfURL:[NSURL URLWithString:urlString];
// don't know if you already got the following?
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
[imageView setImage:myImage];
[self.view addSubview:imageView];

The first line is synchronous (= blocking), so in production, you should rather use - [NSURLRequest start] for this (but that's a bit more complicated).


Or use this for your local images:

UIImage *myImage = [UIImage imageNamed:imageName];
// Now, follow the same steps as in the first code-example, just skip the first line.


Try this (on iOS 4.0 and later):

// Execute a block of code on a background thread.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
               ^(void) 
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    UIImage* image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
    // When IO is done and image created, set it on the main thread.
    dispatch_async(dispatch_get_main_queue(), 
                   ^(void) 
    {
        imageView.image = image;
    });
    [pool release];
});
0

精彩评论

暂无评论...
验证码 换一张
取 消