iOS- 从ViewController调用App Delegate方法

问题描述 投票:246回答:13

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

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

我想做的一个例子是,如果您有两个视图控制器,其中一个带有启动画面。另一个视图控制器在其上进行了遍历,您可以按设置顺序遍历所有房间。初始屏幕上每个房间都有按钮,可让您跳至遍历中的任何点。

ios objective-c uiviewcontroller appdelegate
13个回答
535
投票

您可以这样访问代表:

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

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

然后,如果您具有其他视图控制器的属性,则可以调用类似的内容:

[appDelegate.viewController someMethod];

4
投票

Swift 3.0及更高版本的更新


3
投票

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

[uAppDelegate showLoginView];

0
投票

即使在技术上可行,也不是一个好方法。当您说:“初始屏幕在每个房间都有按钮,使您可以跳至漫游中的任何点。”因此,您想通过appdelegate通过按钮上的tohc事件来调用这些控制器吗?

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


0
投票

[2020年,iOS13,xCode 11.3。适用于Objective-C的是:

#import "AppDelegate.h"


41
投票

听起来像您只需要UINavigationController设置?

您可以通过以下方式在程序中的任何位置获取AppDelegate:>

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];

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

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

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];

此后,您仅需要每个“房间”一个ViewController,并在拾取按钮单击事件时调用以下内容...

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

我尚未测试以上代码,因此可以原谅任何语法错误,但希望伪代码有帮助...

并且如果有人想知道如何在swift中执行此操作:

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

这是我的方法。

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

不要忘记导入。

#import "AppDelegate.h"

只需执行以下步骤

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

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

NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

它避免了到处都包含AppDelegate.h。这是一个很简单的强制转换,可以进行很长的路要走,允许开发独立的Controller并在其他地方重用它们,而不必担心类名等等。

享受

已经添加了很多好的答案。尽管我想添加大部分适合我的内容。

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

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

例如

[kAppDelegate methodName];

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

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

((需要使用UIKit;)

并且如果您需要从watchOS上的视图控制器访问WatchKit扩展代理,则:

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

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()
}

输出:

enter image description here

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

[uAppDelegate showLoginView];

即使在技术上可行,也不是一个好方法。当您说:“初始屏幕在每个房间都有按钮,使您可以跳至漫游中的任何点。”因此,您想通过appdelegate通过按钮上的tohc事件来调用这些控制器吗?

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

[2020年,iOS13,xCode 11.3。适用于Objective-C的是:

#import "AppDelegate.h"

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

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


39
投票

并且如果有人想知道如何在swift中执行此操作:


15
投票

这是我的方法。


13
投票

只需执行以下步骤


11
投票
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

8
投票

已经添加了很多好的答案。尽管我想添加大部分适合我的内容。

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

7
投票

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

5
投票

并且如果您需要从watchOS上的视图控制器访问WatchKit扩展代理,则:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
© www.soinside.com 2019 - 2024. All rights reserved.