Логическая ошибка или моя программа пропускает детали? - PullRequest
0 голосов
/ 09 июля 2009

К вашему сведению, я программирую на объективе-C, но любой может помочь. Я сидел здесь в течение последних двух часов, пытаясь выяснить, в чем проблема, и я сделал все, что я знаю, чтобы отладить эту простую небольшую проблему кодирования. Проверьте код ниже, и я объясню. В приложении это начинается с MainScreenViewController. Мое приложение предоставляет пользователю два варианта ... выбрать кнопку «мастер» или «рабочий» (базовая модель клиент-сервер). В зависимости от выбора пользователя приложение должно загружать другое представление (либо MasterViewController, либо WorkerViewController). Теперь, когда я запускаю приложение, если вы следовали командам печати и гипотетически выбираете кнопку «master», то в моей программе оно печатает «masterButtonPressed - Stage 1» и «masterButtonPressed - Stage 2», но больше ничего. Представление также не меняется, что говорит мне, что проблема заключается в коде в разделе AppDelegate. После того, как я поместил туда команды печати и запустил приложение, оно по-прежнему не печатает два оператора, которые я имею в разделе AppDelegate. У меня есть правильные операторы #import в правильных файлах, я просто не включил их здесь, потому что это занимает бесполезное пространство. Я могу скомпилировать код без ошибок и предупреждений. Теоретически, то, что я должен видеть в консоли, это четыре строки, когда я нажимаю кнопку «мастер», и они (по порядку) - «masterButtonPressed - Stage 1», «changeToMaster - Stage 1», «changeToMaster - Stage 2», и "masterButtonPressed - Stage 2". Может кто-нибудь указать, где я ошибся? Как я уже сказал, при нажатии кнопки «мастер» вид никогда не меняется. Спасибо за вашу помощь!

MainScreenViewController.h

@interface MainScreenViewController : UIViewController {

}

-(IBAction)masterButtonPressed;
-(IBAction)workerButtonPressed;
@end

MainScreenViewController.m

@implementation MainScreenViewController
-(IBAction)masterButtonPressed {
    NSLog(@"masterButtonPressed - Stage 1");
    [ErwinAppDelegate changeToMaster];
    NSLog(@"masterButtonPressed - Stage 2");
    }


-(IBAction)workerButtonPressed {
    NSLog(@"workerButtonPressed - Stage 1");
    [ErwinAppDelegate changeToWorker];
    NSLog(@"workerButtonPressed - Stage 2");
}
@end

ErwinAppDelegate.h

@class MainScreenViewController, MasterViewController, WorkerViewController;
@interface ErwinAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MainScreenViewController *mainScreenViewController;
    MasterViewController *masterViewController;
    WorkerViewController *workerViewController;
}

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet MainScreenViewController *mainScreenViewController;
@property(nonatomic, retain) IBOutlet MasterViewController *masterViewController;
@property(nonatomic, retain) IBOutlet WorkerViewController *workerViewController;

-(void)changeToMaster;
-(void)changeToWorker;

@end

ErwinAppDelegate.m

@implementation ErwinAppDelegate

@synthesize window, mainScreenViewController, masterViewController, workerViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    [window addSubview:mainScreenViewController.view];
    [window addSubview:masterViewController.view];
    [window addSubview:workerViewController.view];
    [window makeKeyAndVisible];

    // Bring first view up front
    [window bringSubviewToFront:mainScreenViewController.view];
}


-(void)changeToMaster {
    NSLog(@"changeToMaster - Stage 1");
    [window bringSubviewToFront:masterViewController.view];
    NSLog(@"changeToMaster - Stage 2");
}


-(void)changeToWorker {
    NSLog(@"changeToWorker - Stage 1");
    [window bringSubviewToFront:workerViewController.view];
    NSLog(@"changeToWorker - Stage 2");
}
@end

Ответы [ 2 ]

2 голосов
/ 09 июля 2009

Похоже, вы пытаетесь вызвать метод класса: +[ErwinAppDelegate changeToMaster] пока вы объявили его как метод экземпляра. Вам необходимо сохранить ссылку на объект делегата приложения в вашем MainViewController - в настоящее время вы имеете дело только со статическими (классовыми) методами.

«Правильный» способ сделать это - создать протокол делегата в MainScreenViewController, а после добавления этого представления в ваше окно в ErwinAppDelegate установить mainScreenViewController.delegate = self.

Вот некоторая очень полезная информация о создании и использовании делегатов: Как создать делегатов в Objective-C?

0 голосов
/ 09 июля 2009

Просто предположение, но вы, вероятно, хотите, чтобы экземпляр вашего ErwinAppDelegate отправил сообщение ...

Должен быть какой-то eadeleg ErwinAppDelegate; [eadeleg changeToMaster]; нет

...