iOS-ViewController에서 App Delegate 메소드 호출


248

내가하려고하는 것은 코드로 작성된 버튼을 클릭하고 다른보기 컨트롤러를 호출 한 다음 새보기 컨트롤러에서 기능을 실행하도록하는 것입니다.

IB에서 비교적 쉽게 수행 할 수 있다는 것을 알고 있지만 옵션은 아닙니다.

내가하고 싶은 일의 예는 스플래시 화면이있는 두 개의 뷰 컨트롤러가있는 경우입니다. 다른 뷰 컨트롤러는 모든 방을 정해진 순서대로 통과 할 수 있도록 집안을 둘러 보았습니다. 스플래시 화면에는 각 방에 대한 버튼이있어 보행 시점으로 이동할 수 있습니다.

답변:


538

다음과 같이 대리인에게 액세스 할 수 있습니다.

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

교체 MainClass를 응용 프로그램 클래스의 이름으로.

그런 다음 다른 뷰 컨트롤러에 대한 속성이 있으면 다음과 같이 호출 할 수 있습니다.

[appDelegate.viewController someMethod];

12
또한 appDelegate.h 파일을 사용하는 곳마다 가져 오거나 @class appDelegate를 수행해야 할 수도 있습니다.
Zaky German

3
appDelegate.h 파일은 대상의 접두사 / 사전 컴파일 된 헤더 파일 IMO에 들어가기에 적합한 후보입니다.
mharper

48
@mharper와 같이 Prefix.pch에서 앱 델리게이트를 가져 오면 #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate)를 추가하여 다음과 같이 앱 델리게이트에 액세스 할 수 있습니다. '[AppDelegate.viewController someMethod]'. 약간 단순화하지만 남용하기가 더 쉽습니다.
Kenny Lövrin

내 응용 프로그램 delegate.h 파일의 @end 후에, 나는 #DEFINE AppDelegate에 ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) 이제 어느 수준의 수입 응용 프로그램 대리인이 직접 사용할 수있는 [AppDelegate.viewController 것으로 someMethod] 추가
harveyslash

43

그리고 누군가가 이것을하는 방법을 궁금해한다면 swift:

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

appDelegate = UIApplication.sharedApplication (). delegate로 설정하면? AppDelegate {}는 더 빠른 접근 방식입니다.
cbartel

@petrsyn 대리인이 될 수있는 것은 nil무엇입니까? 앱에 항상 AppDelegate가 없습니까?!
Honey

최신 버전의 Swift에서는 sharedApplication()로 교체해야합니다 shared. 즉, "응용 프로그램"과 괄호를 제거하십시오. 따라서 Swift 5.2의 전체 작업 코드는 다음과 같습니다. if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota

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

위의 코드를 테스트하지 않았으므로 구문 오류를 용서하지만 의사 코드가 도움이되기를 바랍니다.


8
당신의 대답도 정확합니다. 저는 Cristian과 당신의 대답을 조합하여 사용했습니다. 확인 표시를 나눌 수 있기를 바랍니다.
Mytheral

15

이것이 내가하는 방법입니다.

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

가져 오는 것을 잊지 마십시오.

#import "AppDelegate.h"

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

나는 첫 번째를 추천합니다. 실행하고 이동하십시오.


이것은 특별히 델리게이트의 새로운 인스턴스가 아니라 싱글 톤 애플리케이션의 싱글 톤 델리게이트를 검색합니다
Ammo Goettsch

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

AppDelegate.h를 어디에나 포함시키지 않아도됩니다. 그것은 먼 길을가는 간단한 캐스트입니다. 독립적 인 Controller를 개발하고 클래스 이름 등에 대해 걱정할 필요없이 다른 곳에서 재사용 할 수 있습니다 ...

즐겨


공유 해주셔서 감사합니다. 몇 분 동안 기뻐할 것입니다. 다음과 같은 오류가 발생합니다. 'NSObject <UIApplicationDelegate> * 유형의 개체에서'visibleViewController '속성을 찾을 수 없습니다. 이것에 대한 해결책?
mgyky

8

많은 좋은 답변이 이미 추가되었습니다. 나는 대부분 나에게 맞는 것을 추가하고 싶지만.

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

그리고 그게 다야. 상수처럼 응용 프로그램 전체에서 사용하십시오.

예 :

[kAppDelegate methodName];

해당 .pch 또는 매크로 파일로 yourAppDelegate.h를 가져 오는 것을 잊지 마십시오.


7

누군가 Xamarin (Xamarin.ios / Monotouch)에서 동일 해야하는 경우 다음과 같이 작동합니다.

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(UIKit을 사용해야합니다.)


Swift의 올바른 문장은 appdel : appDelegate = UIApplication.shared.delegate as입니다. AppDelegate
Phil

5

그리고 watchOS의 뷰 컨트롤러에서 WatchKit 확장 델리게이트에 액세스해야하는 경우 :

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

5

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

산출:

여기에 이미지 설명을 입력하십시오


3

당신은 추가 할 수 있습니다 #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]프로젝트의에서 Prefix.pch파일에 다음의 메소드를 호출 AppDelegate어떤에서 UIViewController코드 아래에.

[uAppDelegate showLoginView];

0

기술적으로 실현 가능하더라도 좋은 접근 방식은 아닙니다. 다음과 같이 말할 때 : "스플래쉬 화면에는 각 방마다 버튼이있어 걸어서 어느 지점 으로든 이동할 수 있습니다." 그래서 버튼의 tohc 이벤트를 통해 이러한 컨트롤러를 호출하기 위해 appdelegate를 통과 하시겠습니까?

이 방법은 Apple 지침을 따르지 않으며 많은 단점이 있습니다.


질문의 날짜를 살펴보십시오. Interface Builder가 별도의 응용 프로그램이었고 개발이 매우 다른 짐승이었을 때부터 거슬러 올라갑니다. 몇 년 동안 iOS 개발을 다루지 않았으므로 더 현대적인 답변을 평가할 수 없습니다.
Mytheral

ca .. 그러나 나의 고려 사항은 여전히 ​​유효합니다
ingconti

0

2020 년 iOS13, xCode 11.3 Objective-C에서 작동하는 것은 다음과 같습니다.

#import "AppDelegate.h"

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

그것은 나를 위해 일하고 있습니다, 나는 당신에게 똑같이 희망합니다! :디

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.