Как использовать ViewController в качестве AppDelegate? - PullRequest
0 голосов
/ 13 сентября 2011

Я сделал книгу для детей. Каждая страница является ViewController. В начале я делал все переключения ViewControllers в AppDelegate, но после проблем с AutoRotation я делал все переключения в другом ViewController, который называется ViewControllerSwitch. Раньше код был таким. В AppDelegate:

- (void)goToNextPage3 {
  self.view3 = [[[ViewController3 alloc] init] autorelease];
  view3.view.frame = CGRectMake(769, 0, 768, 1024);
  [window addSubview:view3.view];
  [UIView …SomeAnimationStuff...];  
  [UIView setAnimationDidStopSelector:@selector(animationDidStop3:finished:context:)];
  }


 - (void)animationDidStop3:(NSString *)animationID finished:(NSNumber *)finished context: (void *)context {
   [self.view1a.view removeFromSuperview];
   self.view1a = nil;
   }

А вот код одного из моих контроллеров представления («страниц») с именем ViewController1a:

- (void)buttonClicked {
  MyBookAppDelegate* next2 =(MyBookAppDelegate *) [[UIApplication sharedApplication] delegate];
  [next2 goToNextPage3];
  }

Это сработало как шарм.

Теперь все мои переключения находятся в ViewControllerSwitch. Как мне изменить код в ViewController1a для доступа к goToNextPage3?

Я пробовал это:

 - (void)buttonClicked {
   ViewControllerSwitch* next2 = (ViewControllerSwitch *) [[UIApplication sharedApplication] delegate];
   [next2 goToNextPage3];
}

Это дает мне SIGABRT на [next2 goToNextPage3].

Есть идеи?

Обновление:

Я все еще пытаюсь, так что теперь я сделал это:

в моем Viewcontroller1a.h:

#import <UIKit/UIKit.h>
#import "ViewControllerSwitch.h"

@class ViewController2;
@class ViewControllerSwitch;

@protocol ViewController1Delegate;

@interface ViewController1a : UIViewController 
 {

   id<ViewController1aDelegate>myDelegate;
 }

@property(nonatomic, assign)id<ViewController1Delegate>myDelegate;

@end

@protocol ViewController1Delegate

-(void)goToNextPageV;

@end

и в моем .m файле:

- (void)buttonClicked {
  [self.myDelegate goToNextPageV];
}

я знаю, что в ViewControllerSwitch чего-то не хватает, но я не знаю, что.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Как сказал LordTwaroog, эта строка возвращает объект (делегат вашего приложения) типа MyBookAppDelegate:

[[UIApplication sharedApplication] delegate];

Затем вы пытаетесь привести его к объекту типа ViewControllerSwitch с этим:

(ViewControllerSwitch *)

Это неверно.Ваш делегат приложения является подклассом NSObject, соответствующим протоколу UIApplicationDelegate.Это не контроллер представления.
Правильный код может выглядеть так:

 - (void)buttonClicked {
ViewControllerSwitch* next2 = [ViewControllerSwitch alloc] initWithNibName:@"ViewControllerSwitch" bundle:nil]
[next2 goToNextPage3];
}

Но в зависимости от структуры вашего приложения это может быть не то, что вам нужно.Это создает совершенно новый объект типа ViewControllerSwitch.Это не возвращает возможно уже существующий другой объект ViewControllerSwitch.

Когда вы использовали делегат приложения для выполнения переключения, вы имели возможность извлекать существующий объект делегата приложения (а не извлекать вновь созданный объект его типа).Делегат приложения представляет собой одноэлементный объект, который легко вызывается путем вызова [[UIApplication sharedApplication] делегата].Однако ваш объект ViewControllerSwitch не может быть настроен как одноэлементный.Таким образом, ваш доступ к нему будет зависеть от структуры собственности вашего объекта.Мы должны увидеть больше вашего кода, чтобы помочь вам в этом.

0 голосов
/ 13 сентября 2011

[[UIApplication sharedApplication] делегат] по-прежнему возвращает MyBookAppDelegate.Почему вы пытаетесь извлечь из него объект ViewControllerSwitch?Вы должны использовать свой объект ViewControllerSwitch.Можете ли вы предоставить больше деталей кода для этого объекта?

Возможные решения (если я вас хорошо понимаю):

  1. Поместите ваш ViewControllerSwitch как объект в AppDelegate, чтобы вы моглиuse: ViewControllerSwitch * switch = [[[UIApplication sharedApplication] делегат] viewControllerSwitch]

  2. Каждый ViewController может иметь ссылку на ваш ViewControllerSwitch

  3. Каждый ViewController должен иметьделегат с протоколом (например) ViewControllerDelegate, который будет иметь метод для выполнения переключения.Затем, после установки делегата на соответствующий объект, вы сможете переключать свои страницы
...