iOS - 从ViewController调用App Delegate方法

Myt*_*ral 244 objective-c uiviewcontroller ios appdelegate

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

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

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

小智 533

您可以像这样访问委托:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
Run Code Online (Sandbox Code Playgroud)

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

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

[appDelegate.viewController someMethod];
Run Code Online (Sandbox Code Playgroud)

  • 如果您在Prefix.pch中导入app委托,就像@mharper一样,您也可以同时添加它:#define AppDelegate((MyAppDelegateClass*)[UIApplication sharedApplication] .delegate)然后允许您访问您的app委托'[AppDelegate.viewController someMethod]'.它简化了一点,但它也更容易滥用它. (48认同)
  • 可能还需要在任何地方导入appDelegate.h文件,或者执行@class appDelegate (12认同)
  • appDelegate.h文件是进入目标的前缀/预编译头文件IMO的一个很好的候选者. (3认同)

sra*_*rth 41

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

您可以AppDelegate通过该程序中的任何位置获取

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
Run Code Online (Sandbox Code Playgroud)

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

在代码中,假设你已经创建了你的'House overview'视图控制器,那么你的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];
Run Code Online (Sandbox Code Playgroud)

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

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
[blah.m_navigationController pushViewController:newRoomViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

  • 你的答案也是正确的,我最终结合使用了Cristian和你的答案.我希望我能分开勾选标记. (8认同)

can*_*its 39

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

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
Run Code Online (Sandbox Code Playgroud)


mik*_*396 15

我就是这样做的.

[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];
Run Code Online (Sandbox Code Playgroud)

别忘了导入.

#import "AppDelegate.h"
Run Code Online (Sandbox Code Playgroud)


Tun*_*her 12

只需按照以下步骤操作

1.在你想要app delegate对象的类中导入你的app delegate.

#import "YourAppDelegate.h"
Run Code Online (Sandbox Code Playgroud)

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

YourAppDelegate *appDelegate=( YourAppDelegate* )[UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)

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

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

        [appDelegate yourMethod];
    }
Run Code Online (Sandbox Code Playgroud)

或直接通过

[appDelegate yourMethod];
Run Code Online (Sandbox Code Playgroud)

为了迅速

let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate
Run Code Online (Sandbox Code Playgroud)

我会推荐第一个.跑步和去.


小智 11

NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];
Run Code Online (Sandbox Code Playgroud)

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

请享用


ZaE*_*FaR 8

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

#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);
Run Code Online (Sandbox Code Playgroud)

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

例如

[kAppDelegate methodName];
Run Code Online (Sandbox Code Playgroud)

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


Dan*_* D. 7

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
Run Code Online (Sandbox Code Playgroud)

(需要使用UIKit;)


iAj*_*iAj 6

Swift 3.0 及更高版本的更新

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

    print("someMethodInAppDelegate called")
}
Run Code Online (Sandbox Code Playgroud)

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

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

    appDelegate.someMethodInAppDelegate()
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明


Mar*_*urg 5

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

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
Run Code Online (Sandbox Code Playgroud)