如何将 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 秒,但按钮等。我该如何解决?