如何将 ViewController 用作 AppDelegate?

Posted

技术标签:

【中文标题】如何将 ViewController 用作 AppDelegate?【英文标题】:How to use a ViewController as a AppDelegate? 【发布时间】:2011-09-12 21:16:38 【问题描述】:

我为孩子们做了一本书。每个页面都是一个 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 中缺少某些东西,但我不知道是什么。

【问题讨论】:

【参考方案1】:

正如 LordTwaroog 所说,此行返回 MyBookAppDelegate 类型的对象(您的应用程序委托):

[[UIApplication sharedApplication] delegate];

然后您尝试将其转换为 ViewControllerSwitch 类型的对象:

(ViewControllerSwitch *)

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

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

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

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

【讨论】:

首先感谢。实际上在 ViewController1a 中我只想从 ViewControllerSwitch 调用函数 goToNextPage3。 不客气。要在 ViewControllerSwitch 对象上调用 goToNextPage3 函数,您需要对该对象具有某种访问权限。您的 viewController1a 创建 ViewControllerSwitch 对象(如我上面的示例),或者您通过委托、单例设计或其他方法访问该对象。无论哪种方式,您都需要清楚地了解如何访问该对象。【参考方案2】:

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

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

    将您的 ViewControllerSwitch 作为一个对象放在 AppDelegate 中,这样您就可以使用: ViewControllerSwitch *switch = [[[UIApplication sharedApplication] delegate] viewControllerSwitch]

    每个 ViewController 都可以引用您的 ViewControllerSwitch

    每个 ViewController 都应该有一个带有协议的委托(例如)ViewControllerDelegate,它将有一个执行切换的方法。然后将代理设置为适当的对象后,您就可以切换页面了

【讨论】:

每个自定义 ViewController 都是我书中的一个页面。而不是在 AppDelegate 中切换我的 Viewcontrollers(翻页),我现在在 ViewControllerSwitch 中切换它们。所以现在我希望 ViewController1a(是我书中的一页)访问 ViewControllerSwitch 中的 goToNextPage3 而不是 AppDelegate。 已编辑,查看可能的解决方案。

以上是关于如何将 ViewController 用作 AppDelegate?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从容器视图的父 ViewController 传递到该容器视图的 PageViewController?

iOS - 在用作 UITableView 标头的 ViewController 上设置网点

如何在 AppDelegate 和 ViewController 之间共享属性,并在 App 终止前保存

从 ViewController 调用时如何设置应用的 UIWindow 颜色

Swift App Xib - Second ViewController - 标签不显示 30 秒,但按钮等。我该如何解决?

ViewController 作为子视图