251

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

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

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

4

13 回答 13

541

您可以像这样访问委托:

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

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

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

[appDelegate.viewController someMethod];
于 2011-02-22T19:29:26.520 回答
44

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

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
于 2014-10-17T03:59:33.990 回答
41

听起来你只需要一个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];

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

于 2011-02-22T19:33:34.067 回答
18

我就是这样做的。

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

不要忘记导入。

#import "AppDelegate.h"
于 2013-07-08T17:44:04.510 回答
13

只需按照以下步骤

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

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

于 2014-07-19T15:46:21.267 回答
11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

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

享受

于 2012-02-05T21:36:39.793 回答
8

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

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

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

例如

[kAppDelegate methodName];

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

于 2014-12-10T10:27:05.667 回答
7

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(需要使用 UIKit;)

于 2015-07-22T13:33:38.380 回答
6

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

输出:

在此处输入图像描述

于 2017-11-05T05:01:49.637 回答
5

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

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
于 2015-09-03T20:56:12.777 回答
3

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

[uAppDelegate showLoginView];
于 2015-07-08T11:18:06.147 回答
1

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

#import "AppDelegate.h"

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

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

于 2020-02-03T16:07:34.897 回答
0

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

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

于 2018-02-06T09:57:45.407 回答