0

FYI Я программирую в объективе-C, но любой может помочь. Я сижу здесь в течение последних двух часов, пытаясь понять, в чем проблема, и я сделал все, что знаю, чтобы отладить эту простую проблему с небольшим кодированием. Проверьте код ниже, и я объясню. В приложении он начинается с MainScreenViewController. Мое приложение предоставляет пользователю два варианта: выберите «мастер» или кнопку «рабочий» (базовая модель клиент-сервер). Исходя из выбора пользователя, приложение должно загрузить другое представление (либо MasterViewController, либо WorkerViewController). Теперь, когда я запускаю приложение, если вы следовали командам печати и гипотетически выбирали «главную» кнопку, то в моей программе она выводит «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

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

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

Вот некоторые очень полезную информацию о создании и использовании делегатов: How do I create delegates in Objective-C?

+0

Извините, вы все объяснили, и все это имеет смысл, но у меня есть один вопрос ... на каком представлении вы ссылаетесь, когда говорите «после добавления этого вида в свое окно?» Вы говорите об этом после того, как я добавлю представление mainScreenViewController в окно, а затем объявим его как делегата? –

+0

Что я имел в виду: после запуска '[window addSubview: mainScreenViewController.view]' вы сделали бы что-то вроде 'mainScreenViewController.delegate = self'. Затем внутри вашего экземпляра MainScreenViewController вы можете напрямую вызвать [self.delegate changeToWorker] 'и т. Д. – pix0r

0

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

Там должен быть какой-то ErwinAppDelegate eadeleg; [eadeleg changeToMaster]; нет?

+0

Я пробовал этот метод подхода, но потом он приходит с предупреждением/ошибкой, говоря, что я ссылаюсь на переменную экземпляра (в моем случае это будет окно) в методе класса, так что это не совсем сработало. –

Смежные вопросы