1

I am new to Objective-c and Xcode, yet I believe I know enough about it to realize that something is going wrong here. I have an application using a storyboard, and one of the views in the application is not running its viewDidLoad method. I am not sure if this is relevant, but I had recently accidentally deleted my original storyboard, and had to make another one. The original had worked great with no problems, yet when I use the new one, it does not work. The view in question is also the first view of a Tab Bar Controller, which might be part of the problem.

Here is the code from the class responsible for the view (.h):

#import <UIKit/UIKit.h>
@interface TabSynth : UIViewController
@property (nonatomic, retain) IBOutlet UIImageView *tomeWater;
@property (nonatomic, retain) IBOutlet UIImageView *tomeFire;
@property (nonatomic, retain) IBOutlet UIImageView *tomeAir;
@property (nonatomic, retain) IBOutlet UIImageView *tomeEarth;
@property (nonatomic, retain) IBOutlet UIImageView *tomeDark;
@property (nonatomic, retain) IBOutlet UIImageView *tomeLight;
@property (nonatomic, retain) IBOutlet UIButton *airSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *darkSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *earthSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *fireSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *lightSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *waterSynthButton;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonLarv;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonAmoeb;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonLarv1;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonAmoeb1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeWater1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeFire1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeAir1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeEarth1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeDark1;
@property (nonatomic, retain) IBOutlet UIImageView *tomeLight1;

And here is the code from the (.m):

#import "TabSynth.h"

@implementation TabSynth

@synthesize tomeWater;
@synthesize tomeFire;
@synthesize tomeAir;
@synthesize tomeEarth;
@synthesize tomeDark;
@synthesize tomeLight;
@synthesize tomeWater1;
@synthesize tomeFire1;
@synthesize tomeAir1;
@synthesize tomeEarth1;
@synthesize tomeDark1;
@synthesize tomeLight1;
@synthesize airSynthButton;
@synthesize darkSynthButton;
@synthesize earthSynthButton;
@synthesize fireSynthButton;
@synthesize lightSynthButton;
@synthesize waterSynthButton;
@synthesize synthButtonLarv;
@synthesize synthButtonAmoeb;
@synthesize synthButtonLarv1;
@synthesize synthButtonAmoeb1;

-(void)viewDidLoad {
    extern int gTomeAir;
    extern int gTomeDark;
    extern int gTomeEarth;
    extern int gTomeFire;
    extern int gTomeLight;
    extern int gTomeWater;
    extern int gAmoebaeNum;
    extern int gLarvaeNum;
    synthButtonAmoeb.hidden=YES;
    synthButtonAmoeb1.hidden=NO;
    synthButtonLarv.hidden=YES;
    synthButtonLarv1.hidden=NO;
    if (gTomeAir>0) {
        tomeAir.hidden=NO;
        tomeAir1.hidden=YES;
        airSynthButton.hidden=NO;
    }
    if (gTomeDark>0) {
        tomeDark.hidden=NO;
        tomeDark1.hidden=YES;
        darkSynthButton.hidden=NO;
    }
    if (gTomeEarth>0) {
        tomeEarth.hidden=NO;
        tomeEarth1.hidden=YES;
        earthSynthButton.hidden=NO;
    }
    if (gTomeFire>0) {
        tomeFire.hidden=NO;
        tomeFire1.hidden=YES;
        fireSynthButton.hidden=NO;
    }
    if (gTomeLight>0) {
        tomeLight.hidden=NO;
        tomeLight1.hidden=YES;
        lightSynthButton.hidden=NO;
    }
    if (gTomeWater>0) {
        tomeWater.hidden=NO;
        tomeWater1.hidden=YES;
        waterSynthButton.hidden=NO;
    }
    if (gAmoebaeNum > 0) {
        synthButtonAmoeb.hidden=NO;
        synthButtonAmoeb1.hidden=YES;
    }
    else {
        synthButtonAmoeb.hidden=YES;
        synthButtonAmoeb1.hidden=NO;
    }
    if (gLarvaeNum >= 1) {
        synthButtonLarv.hidden=NO;
        synthButtonLarv1.hidden=YES;
    }
    else {
        synthButtonLarv.hidden=YES;
        synthButtonLarv1.hidden=NO;
    }
}

In the if statements, the external integers being called (gTome) were set equal to a number in the previous view. Any help at all would be great, and I apologize for the simpleness of my coding.

Brennan
  • 11
  • 1
  • 2

2 Answers2

2

If it's not calling viewDidLoad, then the first thing to check is that in your storyboard you have properly set TabSynth as the custom class of your view controller. Also, I don't see an NSLog in your viewDidLoad method. How do you know it's not being called?

By the way, did you know that you can put non-UI objects in a nib or storyboard? I think this might help you simplify your code. For example, you could have a class ElementViews defined like this:

ElementViews.h

@interface ElementViews : NSObject

@property (assign, nonatomic) IBOutlet UIImageView *tome;
@property (assign, nonatomic) IBOutlet UIButton *synthButton;
@property (assign, nonatomic) IBOutlet UIImageView *tome1;

@end

and then in your TabSynth class, instead of three outlets for every element, you just have one outlet:

TabSynth.h

@class ElementViews;

@interface TabSynth : UIViewController

@property (nonatomic, retain) IBOutlet ElementViews *waterViews;
@property (nonatomic, retain) IBOutlet ElementViews *fireViews;
@property (nonatomic, retain) IBOutlet ElementViews *airViews;
@property (nonatomic, retain) IBOutlet ElementViews *earthViews;
@property (nonatomic, retain) IBOutlet ElementViews *darkViews;
@property (nonatomic, retain) IBOutlet ElementViews *lightViews;

@property (nonatomic, retain) IBOutlet UIButton *synthButtonLarv;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonAmoeb;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonLarv1;
@property (nonatomic, retain) IBOutlet UIButton *synthButtonAmoeb1;
...

In your storyboard, you drag a generic "Object" (looks like an orange cube) into your TabSynth scene. Change its custom class to ElementViews and its identity label to Water Views. Connect the waterViews outlet of the TabSynth to this new ElementViews object, and connect the outlets of the ElementViews object to the three water views (the tome and tome1 image views and the synthButton button). Repeat for the other five elements.

Then you can simplify your viewDidLoad method like this:

- (void)configureElementViews:(ElementViews *)elementViews state:(int)state {
    if (state > 0) {
        elementViews.tome.hidden = NO;
        elementViews.tome1.hidden = YES;
        elementViews.synthButton.hidden = NO;
    }
}

- (void)viewDidLoad {
    extern int gTomeAir;
    extern int gTomeDark;
    extern int gTomeEarth;
    extern int gTomeFire;
    extern int gTomeLight;
    extern int gTomeWater;
    extern int gAmoebaeNum;
    extern int gLarvaeNum;

    synthButtonAmoeb.hidden=YES;
    synthButtonAmoeb1.hidden=NO;
    synthButtonLarv.hidden=YES;
    synthButtonLarv1.hidden=NO;

    [self configureElementViews:self.waterViews state:gTomeWater];
    [self configureElementViews:self.fireViews state:gTomeFire];
    [self configureElementViews:self.airViews state:gTomeAir];
    [self configureElementViews:self.earthViews state:gTomeEarth];
    [self configureElementViews:self.darkViews state:gTomeDark];
    [self configureElementViews:self.lightViews state:gTomeLight];
}
rob mayoff
  • 375,296
  • 67
  • 796
  • 848
  • Thank you very much for the help with my problem, I did not expect to get this much feedback. I hadn't realized I could use NSLog for iOS applications at first. After reviewing the app, I realize that the viewDidLoad was being called, and the problem instead was with the external variables gTomeAir... not being set. Turns out that the views were being switched before the method to set them was run. Thank you especially for the extra help with simplifying my code, I will be sure to try it out :D – Brennan Jan 26 '12 at 03:42
-1

ok but you must write [super viewDidLoad] at the beginning of the method -viewDidLoad to call the viewDidLoad of the Controller itself (the father or its predecessor in the hierarchy of object) before writing your superb code which create a derived version of -viewDidLoad.

voila, good luck.

msturdy
  • 10,479
  • 11
  • 41
  • 52