Xcode - метод viewDidLoad не работает - PullRequest
1 голос
/ 26 января 2012

Я новичок в Objective-C и XCode, но я верю, что знаю об этом достаточно, чтобы понять, что здесь что-то идет не так.У меня есть приложение, использующее раскадровку, и одно из представлений в приложении не выполняет его метод viewDidLoad.Я не уверен, относится ли это к делу, но недавно я случайно удалил свою исходную раскадровку и мне пришлось создать еще одну.Оригинал работал без проблем, но когда я использую новый, он не работает.Представление, о котором идет речь, также является первым представлением контроллера панели вкладок, что может быть частью проблемы.

Вот код из класса, ответственного за представление (.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;

А вот код из (.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;
    }
}

В операторах if вызываемые внешние целые числа (gTome) были установлены равными числу в предыдущем представлении.Любая помощь была бы великолепна, и я прошу прощения за простоту моего кодирования.

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Если он не вызывает viewDidLoad, то первое, что нужно проверить, это то, что в вашей раскадровке вы правильно установили TabSynth в качестве пользовательского класса вашего контроллера представления.Кроме того, я не вижу NSLog в вашем viewDidLoad методе.Откуда вы знаете, что он не вызывается?

Кстати, знаете ли вы, что вы можете помещать не-пользовательские объекты в перо или раскадровку?Я думаю, что это может помочь вам упростить ваш код.Например, вы можете иметь класс ElementViews, определенный следующим образом:

ElementViews.h

@interface ElementViews : NSObject

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

@end

, а затем в вашем классе TabSynth вместо трех выходов для каждого элемента,у вас есть только один выход:

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;
...

В вашей раскадровке вы перетаскиваете общий «Объект» (похожий на оранжевый куб) в вашу TabSynth сцену.Измените его пользовательский класс на ElementViews и его идентификационную метку на Water Views.Подключите выход waterViews TabSynth к этому новому объекту ElementViews и подключите выходы объекта ElementViews к трем видам воды (изображения tome и tome1 и synthButtonкнопка).Повторите эти действия для остальных пяти элементов.

Затем вы можете упростить свой метод viewDidLoad следующим образом:

- (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];
}
0 голосов
/ 13 мая 2014

хорошо, но вы должны написать [super viewDidLoad] в начале метода -viewDidLoad, чтобы вызвать viewDidLoad самого Controller (отца или его предшественника в иерархии объектов), прежде чем писать свой превосходный код, которыйсоздать производную версию -viewDidLoad.

вуаля, удачи.

...