【问题标题】:iOS - Calling App Delegate method from ViewControlleriOS - 从 ViewController 调用 App Delegate 方法
【发布时间】:2011-07-02 05:59:32
【问题描述】:

我想要做的是单击一个按钮(在代码中创建)并让它调用不同的视图控制器,然后让它在新的视图控制器中运行一个函数。

我知道这可以在 IB 中相对轻松地完成,但这不是一个选择。

我想要做的一个例子是,如果您有两个视图控制器,其中一个带有房子的初始屏幕。另一个视图控制器上有一个穿过房子的通道,您可以按照设定的顺序穿过所有房间。初始屏幕将为每个房间提供按钮,让您可以跳转到步行中的任何点。

【问题讨论】:

    标签: ios objective-c uiviewcontroller appdelegate


    【解决方案1】:

    您可以像这样访问委托:

    MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
    

    MainClass 替换为您的应用程序类的名称。

    然后,如果你有另一个视图控制器的属性,你可以调用类似的东西:

    [appDelegate.viewController someMethod];
    

    【讨论】:

    • 可能还需要在任何使用的地方导入 appDelegate.h 文件,或者执行 @class appDelegate
    • appDelegate.h 文件非常适合放入目标的前缀/预编译头文件 IMO。
    • 如果您在 Prefix.pch 中导入您的应用程序委托,就像 @mharper 所说,您也可以同时添加:#define AppDelegate ((MyAppDelegateClass *)[UIApplication sharedApplication].delegate) 然后允许您访问您的应用程序委托,如“[AppDelegate.viewController someMethod]”。它简化了一点,但也更容易滥用它。
    • 在我的 app delegate.h 文件的@end 之后,我添加了#define AppDelegate ((MyAppDelegateClass *)[UIApplication sharedApplication].delegate) 现在无论哪个类导入app delegate 都可以直接使用[AppDelegate.viewController一些方法]
    【解决方案2】:

    听起来你只需要一个UINavigationController 设置?

    您可以通过

    在程序中的任何位置获取AppDelegate
    YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
    

    在您的应用委托中,您应该通过 IB 或代码设置导航控制器。

    在代码中,假设您已经创建了“房屋概览”视图控制器,那么在您的 AppDelegate didFinishLaunchingWithOptions 中应该是这样的......

    self.m_window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds] autorelease];
    self.m_navigationController = [[[UINavigationController alloc]initWithRootViewController:homeViewController]autorelease];
    [m_window addSubview:self.m_navigationController.view];
    

    在此之后,您只需要每个“房间”的视图控制器,并在拾取按钮单击事件时调用以下内容...

    YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
    [blah.m_navigationController pushViewController:newRoomViewController animated:YES];
    

    我没有测试过上面的代码,所以请原谅任何语法错误,但希望伪代码有帮助......

    【讨论】:

    • 你的答案也是正确的,我最终使用了克里斯蒂安和你的答案的组合。我希望我可以拆分复选标记。
    【解决方案3】:
    NSObject <UIApplicationDelegate> * universalAppDelegate = 
        ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];
    

    它避免了在任何地方都包含您的 AppDelegate.h。 这是一个很简单的演员阵容,它允许开发独立的控制器并在其他地方重用它们,而不必担心类名等等......

    享受

    【讨论】:

    • 感谢您的分享,这让我开心了几分钟,可能它会以某种方式工作,但是如果我想从中使用像 visibleViewController 这样的方法呢?它会给出这样的错误:在'NSObject *类型的对象上找不到属性'visibleViewController'。有什么解决办法吗?
    【解决方案4】:

    我就是这样做的。

    [[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];
    

    别忘了导入。

    #import "AppDelegate.h"
    

    【讨论】:

      【解决方案5】:

      只需按照以下步骤操作

      1.在您想要应用代理对象的类中导入您的应用代理。

      #import "YourAppDelegate.h"
      

      2.在你的类中创建你的应用委托对象的实例(它基本上是一个单例)。

      YourAppDelegate *appDelegate=( YourAppDelegate* )[UIApplication sharedApplication].delegate;
      

      3.现在使用选择器调用方法

      if([appDelegate respondsToSelector:@selector(yourMethod)]){
      
              [appDelegate yourMethod];
          }
      

      或直接由

      [appDelegate yourMethod];
      

      快速

      let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate
      

      我会推荐第一个。奔跑吧。

      【讨论】:

      • 这不是委托的新实例,而是检索单例应用程序的单例委托
      【解决方案6】:

      如果有人想知道如何在swift 中做到这一点:

      if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
         myDelegate.someMethod()
      }
      

      【讨论】:

      • 如果让 appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {} 是 swift 中更好的方法。
      • @petrsyn 代表可以是nil 是什么意思?那不是一个应用程序总是有一个 AppDelegate 吗?!
      • 在最新版本的 Swift 中,sharedApplication() 应该替换为 shared。即,删除“应用程序”和括号。所以从 Swift 5.2 开始的完整工作代码是:if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
      【解决方案7】:

      已经添加了很多好的答案。虽然我想添加一些最适合我的东西。

      #define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);
      

      就是这样。在整个应用程序中使用它,就像一个常量一样。

      例如

      [kAppDelegate methodName];
      

      不要忘记在相应的 .pch 或宏文件中导入 yourAppDelegate.h。

      【讨论】:

        【解决方案8】:

        您可以在项目的Prefix.pch 文件中添加#define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate],然后使用以下代码在任何UIViewController 中调用AppDelegate 的任何方法。

        [uAppDelegate showLoginView];
        

        【讨论】:

          【解决方案9】:

          如果有人在 Xamarin (Xamarin.ios / Monotouch) 中需要相同的功能,这对我有用:

          var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
          

          (需要使用 UIKit;)

          【讨论】:

          • Swift 中正确的说法是 let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate
          【解决方案10】:

          如果您需要从 watchOS 上的视图控制器访问您的 WatchKit 扩展委托:

          extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
          

          【讨论】:

            【解决方案11】:

            Swift 3.0 及更高版本的更新

            //
            // Step 1:- Create a method in AppDelegate.swift
            //
            func someMethodInAppDelegate() {
            
                print("someMethodInAppDelegate called")
            }
            

            通过以下方式从您的控制器调用上述方法

            //
            // Step 2:- Getting a reference to the AppDelegate & calling the require method...
            //
            if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            
                appDelegate.someMethodInAppDelegate()
            }
            

            输出:

            【讨论】:

              【解决方案12】:

              即使在技术上可行,也不是一个好方法。 当你说:“启动画面将有每个房间的按钮,可以让你跳到走过的任何点。” 所以你想通过appdelegate通过按钮上的tohc事件调用这些控制器?

              这种方法不遵循 Apple 准则,并且有很多缺点。

              【讨论】:

              • 看看问题上的日期......这是从早前Interface Builder 是一个单独的应用程序和开发是一个非常不同的野兽。我已经很多年没有接触过 iOS 开发了,所以我无法评估更现代的答案。
              • 它可能.. 但我的考虑仍然有效
              【解决方案13】:

              2020 年,iOS13,xCode 11.3。对 Objective-C 有用的是:

              #import "AppDelegate.h"

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

              它对我有用,我希望对你也一样! :D

              【讨论】:

                猜你喜欢
                • 2014-09-16
                • 1970-01-01
                • 2016-05-06
                • 1970-01-01
                • 1970-01-01
                • 2012-08-22
                • 2011-08-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多