【问题标题】:AppDelegate to UIViewControllerAppDelegate 到 UIViewController
【发布时间】:2012-11-27 01:33:57
【问题描述】:

我有一个带有标头和实现文件以及两个 appDelegate 文件的示例代码。我想将项目的功能添加到我的应用程序中。前两个文件是一个ViewController文件,所以我只要把它拖进去,但是另外两个是AppDelegate,我显然不能有两个app delegate。但是在这个示例应用程序的情况下,应用程序委托被用作适当的视图控制器,因为在 UIViewController 文件的 .m 文件中,有这样的代码:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

由于AppDelegate 没有实现applicationWillBecomeActive: 等方法,如何将文件转换为UIViewController 文件?我需要在上面的代码中更改什么来调用控制器而不是委托(我的 AppDelegate 将保持不变)。

代码在GitHub

这就是我所做的(代码需要包含 Facebook API)。转到下载选项卡并下载 Archive.zip 和 AppDelegate.zip:https://github.com/Alexmitico45/FacebookRequests/downloads

基本上,控制器ContactFBSViewController 与情节提要中的视图控制器相关联。

【问题讨论】:

  • 我们有机会看到示例代码吗?不看代码很难准确推断出你的问题是什么。
  • 这就是我所做的,(代码需要导入 FACEBOOK API):github.com/Alexmitico45/FacebookRequests/downloads ...继续下载并下载 archive.zip(4 个文件)。基本上控制器 ContactFBSViewController 链接到情节提要中的视图控制器。
  • 注意:我已按照代码进行操作,您可以下载我在上面提供的网站创建的文件

标签: ios xcode


【解决方案1】:

如果我理解正确,您希望示例中 AppDelegate 的功能出现在您的应用中。但您不想替换应用现有的 AppDelegate?

AppDelegate 类与另一个类并没有什么不同。它的不同之处在于它实现了UIApplicationDelegate,并在main.m 中明确引用为您应用的启动类。

如果你想把它变成另一个类,我会:

  1. 重命名类(.h、.m、接口和实现名称),然后将其放入您的项目中。
  2. 在 NewName.h 中,删除顶部的 UIApplicationDelegate 实现。
  3. 在 NewName.m 中,您希望查看 UIApplication 方法 部分中的任何功能,因为这是专门分配给 AppDelegate 类执行的功能,并查看是否需要或如何需要合并到您现有的 AppDelegate 类中。然后从 NewName.m 中删除那些 UIApplicationDelegate 方法,因为它们只有在您实现 UIApplicationDelegate 时才能存在。

由于ViewController 利用了它所期望的 AppDelegate 是 UIApplication 层次结构中的一个长期存在的类这一事实,因此您需要复制该行为。这可能最容易通过在 ViewController.h 中创建一个新的弱属性来引用 NewName 来实现:

ViewController.h

@class NewName;
@property (nonatomic, weak) NewName *newNameDelegate;

ViewController.m

#import "NewName.h"

...

@implementation ViewController
@synthesize newNameDelegate;

...

- (IBAction)sendRequestButtonAction:(id)sender {
    if (FBSession.activeSession.isOpen) {
        [newNameDelegate sendRequest];
    }
}

NewName.m

...

self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.viewController.newNameDelegate = self;

...

希望这能让您知道从哪里开始。

【讨论】:

  • 很好的答案,我会试试这个,让你知道。谢谢
  • 你确定我需要添加 self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; self.viewController.newNameDelegate = self;在 NewName.m 中?因为在实际项目中,它的 viewcontroller.h 具有按钮属性
  • 我不认为 N​​ewName 被调用,因为我在视图中放置了一个警报确实加载但它没有显示,但我可以看到函数已导入,因为如果我删除#import 它给出错误
  • 我没有在示例中添加显式代码来显示它,但是您需要将代码添加到现有的 AppDelegate(例如在application:didFinishLaunchingWithOptions: 中)以分配和调用 NewName 的实例。我不清楚您不想编辑现有 AppDelegate 类的程度。您必须在某种程度上对其进行编辑,因为它是在您的应用程序中启动所有功能的入口点。理想情况下,您只需将示例 AppDelegate 的相关部分合并到您自己的部分中,而 ViewController 可以或多或少保持不变。
  • 我这样做了,但是当我按下 Viewcontroller 中声明的按钮身份验证时,什么也没有发生。我给 altrady 添加了其他功能到我的应用程序委托
【解决方案2】:

我解决了这个问题。我必须做的是让视图控制器成为单例:

+ (FacebookViewController *) sharedManager;

..然后使用此代码访问它:

FacebookManager *manager = [FacebookManager sharedManager];

经过几天的反复试验,它终于奏效了!!

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2020-10-01
    • 2019-09-22
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多