UI View Controller crashes after interruption

Posted by nosuic on Stack Overflow See other posts from Stack Overflow or by nosuic
Published on 2010-12-31T17:17:04Z Indexed on 2010/12/31 17:54 UTC
Read the original article Hit count: 232

Filed under:
|
|

Given the multitasking of iOS I thought it wouldn't be a pain to pause and resume my app, by pressing the home button or due to a phone call, but for a particular view controller it crashes.

The navigation bar is working fine i.e. when I tap "Back" it's ok, but if I try to tap controls of the displayed UI View Controller then I get EXC_BAD_ACCESS.. =/

Please find the code of my problematic View Controller below. I'm not very sure about it myself, because I used loadView to build its View, but apart from this interruption problem it works fine.

StoreViewController.h

#import <UIKit/UIKit.h>

@protocol StoreViewDelegate <NSObject>
@optional
- (void)DirectionsClicked:(double)lat:(double)lon;
@end

@interface StoreViewController : UIViewController 
{
    double latitude;
    double longitude;
    NSString *description;  
    NSString *imageURL;
    short rating;
    NSString *storeType;
    NSString *offerType;

    UIImageView *imageView;
    UILabel *descriptionLabel;

    id<StoreViewDelegate> storeViewDel;
}

@property (nonatomic) double latitude;
@property (nonatomic) double longitude;
@property (nonatomic) short rating;
@property (nonatomic,retain) NSString *description;
@property (nonatomic,retain) NSString *imageURL;
@property (nonatomic,retain) NSString *storeType;
@property (nonatomic,retain) NSString *offerType;
@property (assign) id<StoreViewDelegate> storeViewDel;

@end

StoreViewController.m

#import "StoreViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface StoreViewController()

-(CGSize) calcLabelSize:(NSString *)string withFont:(UIFont *)font  maxSize:(CGSize)maxSize;

@end

@implementation StoreViewController

@synthesize storeViewDel, longitude, latitude, description, imageURL, rating, offerType, storeType;

- (void)mapsButtonClicked:(id)sender
{
}

- (void)loadView 
{
    UIView *storeView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, 0.0f)];

    // Colours
    UIColor *lightBlue = [[UIColor alloc] initWithRed:(189.0f / 255.0f) 
                                              green:(230.0f / 255.0f) 
                                               blue:(252.0f / 255.0f) alpha:1.0f];

    UIColor *darkBlue = [[UIColor alloc] initWithRed:(28.0f/255.0f) 
                                                green:(157.0f/255.0f) 
                                                 blue:(215.0f/255.0f) 
                                                alpha:1.0f];

    // Layout
    int width = self.navigationController.view.frame.size.width;
    int height = self.navigationController.view.frame.size.height;
    float firstRowHeight = 100.0f;
    int margin = width / 20;
    int imgWidth = (width - 3 * margin) / 2;

    // Set ImageView 
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(margin, margin, imgWidth, imgWidth)];
    CALayer *imgLayer = [imageView layer];
    [imgLayer setMasksToBounds:YES];
    [imgLayer setCornerRadius:10.0f];
    [imgLayer setBorderWidth:4.0f];
    [imgLayer setBorderColor:[lightBlue CGColor]];
    // Load default image
    NSData *imageData = [NSData dataWithContentsOfFile:@"thumb-null.png"];
    UIImage *image = [UIImage imageWithData:imageData];
    [imageView setImage:image];

    [storeView addSubview:imageView];

    // Set Rating
    UIImageView *ratingView = [[UIImageView alloc] initWithFrame:CGRectMake(3 * width / 4 - 59.0f, 
                                                                        margin, 
                                                                        118.0f,
                                                                        36.0f)];
    UIImage *ratingImage = [UIImage imageNamed:@"bb-rating-0.png"];
    [ratingView setImage:ratingImage];
    [ratingImage release];

    [storeView addSubview:ratingView];

    // Set Get Directions button
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(3 * width / 4 - 71.5f, 
                                                               36.0f + 2*margin, 
                                                               143.0f, 63.0f)];
    [btn addTarget:self action:@selector(mapsButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    UIImage *mapsImgUp = [UIImage imageNamed:@"bb-maps-up.png"];
    [btn setImage:mapsImgUp forState:UIControlStateNormal];
    [mapsImgUp release];
    UIImage *mapsImgDown = [UIImage imageNamed:@"bb-maps-down.png"];
    [btn setImage:mapsImgDown forState:UIControlStateHighlighted];
    [mapsImgDown release];

    [storeView addSubview:btn];
    [btn release];

    // Set Description Text
    UIScrollView *descriptionView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, 
                                                                                   imgWidth + 2 * margin, 
                                                                                   width, 
                                                                                   height - firstRowHeight)];
    descriptionView.backgroundColor = lightBlue;
    CGSize s = [self calcLabelSize:description withFont:[UIFont systemFontOfSize:18.0f] maxSize:CGSizeMake(width, 9999.0f)];
    descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(margin, margin, width - 2 * margin, s.height)];
    descriptionLabel.lineBreakMode = UILineBreakModeWordWrap;
    descriptionLabel.numberOfLines = 0;
    descriptionLabel.font = [UIFont systemFontOfSize:18.0f];
    descriptionLabel.textColor = darkBlue;
    descriptionLabel.text = description;
    descriptionLabel.backgroundColor = lightBlue;

    [descriptionView addSubview:descriptionLabel];
    [storeView addSubview:descriptionView];
    [descriptionLabel release];

    [lightBlue release];
    [darkBlue release];

    self.view = storeView;
    [storeView release];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc 
{
[imageView release];
    [descriptionLabel release];

    [super dealloc];
}

@end

Any suggestions ?

Thank you,

F.

© Stack Overflow or respective owner

Related posts about iphone

Related posts about exc-bad-access