iOS - 从ViewController调用App Delegate方法

时间:2011-02-22 19:14:46

标签: ios objective-c uiviewcontroller appdelegate

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

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

我想要做的一个例子是,如果你有两个视图控制器,一个带有闪光灯的房子。另一个视图控制器在房子上走过,你可以按照设定的顺序通过所有房间。启动画面会有每个房间的按钮,可以让你跳到步行的任何一点。

13 个答案:

答案 0 :(得分:527)

您可以像这样访问代理:

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

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

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

[appDelegate.viewController someMethod];

答案 1 :(得分:41)

听起来你只需要UINavigationController设置?

您可以通过

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

在您的app 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];

在此之后,您只需要每个'房间'一个viewcontroller,并在选择按钮点击事件时调用以下内容...

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

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

答案 2 :(得分:39)

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

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

答案 3 :(得分:15)

我就是这样做的。

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

别忘了导入。

#import "AppDelegate.h"

答案 4 :(得分:12)

只需按照以下步骤操作

即可

1.在你想要app delegate object的类中导入你的app delegate。

#import "YourAppDelegate.h"

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

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

3.现在使用选择器

调用方法
if([appDelegate respondsToSelector:@selector(yourMethod)]){

        [appDelegate yourMethod];
    }

或直接

[appDelegate yourMethod];

for swift

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

我会推荐第一个。跑去。

答案 5 :(得分:11)

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

避免在任何地方都包含AppDelegate.h。 这是一个很简单的演员,可以开发独立的Controller并在其他地方重用它们,而不用担心类名等等......

享受

答案 6 :(得分:8)

已经添加了许多好的答案。虽然我想在大多数时候添加适合我的东西。

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

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

e.g。

[kAppDelegate methodName];

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

答案 7 :(得分:7)

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(需要使用UIKit;)

答案 8 :(得分:5)

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

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

答案 9 :(得分:3)

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

[uAppDelegate showLoginView];

答案 10 :(得分:3)

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

答案 11 :(得分:1)

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

#import "AppDelegate.h"

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

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

答案 12 :(得分:0)

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

这种方法不符合Apple指南,并且有很多缺点。