如何将ViewController用作AppDelegate?

时间:2011-09-12 21:16:38

标签: objective-c xcode uiviewcontroller uiapplicationdelegate

我为孩子们写了一本书。每个页面都是一个ViewController。一开始,我在AppDelegate中完成了所有ViewControllers的切换,但是在遇到AutoRotation的麻烦后,我在另一个名为ViewControllerSwitch的ViewController中进行了切换。 之前,代码是这样的。在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];
}

它在[next2 goToNextPage3]给我一个SIGABRT。

有什么想法吗?

更新:

我还在尝试,所以现在我这样做了:

在我的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 :(得分:0)

[[UIApplication sharedApplication]委托]仍然返回MyBookAppDelegate。为什么要尝试从中获取ViewControllerSwitch对象?您应该使用ViewControllerSwitch对象。你能提供关于这个对象的更多代码细节吗?

可能的解决方案(如果我理解你的话):

  1. 将ViewControllerSwitch作为AppDelegate中的对象,以便您可以使用: ViewControllerSwitch * switch = [[[UIApplication sharedApplication] delegate] viewControllerSwitch]

  2. 每个ViewController都可以引用您的ViewControllerSwitch

  3. 每个ViewController都应该有一个带协议的委托(例如)ViewControllerDelegate,它将有一个执行切换的方法。然后在将委托设置为适当的对象后,您将能够切换页面

答案 1 :(得分:0)

正如LordTwaroog所说,这一行正在返回一个MyBookAppDelegate类型的对象(你的app委托):

[[UIApplication sharedApplication] delegate];

然后你试图将它转换为ViewControllerSwitch类型的对象:

(ViewControllerSwitch *)

这是不正确的。您的app委托是符合UIApplicationDelegate协议的NSObject子类。它不是视图控制器 正确的代码可能如下所示:

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

但根据您的应用结构,这可能不是您想要的。这是创建一个ViewControllerSwitch类型的全新对象。它没有返回可能已经存在的其他ViewControllerSwitch对象。

当您使用app delegate执行切换时,您可以检索现有的app delegate对象(而不是检索新创建的对象类型)。 app委托是一个单例对象,可以通过调用[[UIApplication sharedApplication]委托]轻松检索。但是,您的ViewControllerSwitch对象可能不会设置为单例。因此,您对它的访问权限取决于您的对象所有权结构。我们必须看到更多代码来帮助您。