iOS-wywołanie metody delegowania aplikacji z ViewController

To, co próbuję zrobić, to kliknąć przycisk (który został utworzony w kodzie) i wywołać inny kontroler widoku, a następnie uruchomić funkcję w nowym kontrolerze widoku.

Wiem, że można to zrobić stosunkowo łatwo w IB, ale to nie wchodzi w grę.

Przykładem tego, co chcę zrobić, byłoby, gdybyś miał dwa kontrolery widoku, jeden z ekranem powitalnym house ' a. Drugi kontroler widoku miał spacer po domu, na którym można było przejść przez wszystkie pokoje w zestawie spokój. Ekran powitalny będzie miał przyciski dla każdego pokoju, które pozwolą Ci przejść do dowolnego punktu na przejściu.

Author: Mytheral, 2011-02-22

12 answers

Możesz uzyskać dostęp do delegata w następujący sposób:

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

Zastąp MainClass nazwą twojej klasy aplikacji.

Następnie, jeśli posiadasz właściwość dla innego kontrolera widoku, możesz wywołać coś w stylu:

[appDelegate.viewController someMethod];
 521
Author: Cristian Radu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 19:29:26

Wygląda na to, że potrzebujesz konfiguracji?

Możesz uzyskać AppDelegate w dowolnym miejscu w programie poprzez

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

W aplikacji delegat powinieneś mieć konfigurację kontrolera nawigacji, albo przez IB lub w kodzie.

W kodzie, zakładając, że stworzyłeś już swój viewcontroller 'House overview', będzie to coś takiego w Twoim 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];

Po tym wystarczy ViewController dla 'pokoju' i wywołać następujące zdarzenie, gdy przycisk click jest odebrałem...

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

Nie testowałem powyższego kodu, więc wybacz Błędy składniowe, ale mam nadzieję, że pseudo kod będzie pomocny...

 37
Author: sradforth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 04:56:26

A jeśli ktoś się zastanawia jak to zrobić w swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
 37
Author: canhazbits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 17:13:16

Tak to robię.

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

Nie zapomnij zaimportować.

#import "AppDelegate.h"
 14
Author: mikemike396,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 17:44:04

Po prostu wykonaj następujące kroki

1.zaimportuj delegat aplikacji do klasy, w której chcesz obiekt delegat aplikacji.

#import "YourAppDelegate.h"

2.wewnątrz klasy Utwórz instancję obiektu delegata aplikacji (w zasadzie singleton).

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

3.Teraz wywołaj metodę używając selektora

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

        [appDelegate yourMethod];
    }

Lub bezpośrednio przez

[appDelegate yourMethod];

Dla swift

let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate
Polecam pierwszą. Biegnij i idź.
 11
Author: Tunvir Rahman Tusher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 07:26:46
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

To uniknąć konieczności dołączania AppDelegate./ align = "left" / Jest to prosty cast, który przechodzi długą drogę, pozwalając na opracowanie niezależnego kontrolera i ponowne użycie go w innym miejscu, bez martwienia się o nazwę klasy i tak dalej...

Enjoy

 10
Author: bruno.yvan.morel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-05 21:36:39

Dodano już wiele dobrych odpowiedzi. Chociaż chcę dodać coś, co najbardziej mi odpowiada.

#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);
I to wszystko. Używaj go w całej aplikacji tak jak stała.

Np.

[kAppDelegate methodName];

Nie zapomnij zaimportować yourAppDelegate.h W odpowiedni .pch lub plik makr.

 7
Author: ZaEeM ZaFaR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 10:27:05

Jeśli ktoś potrzebuje tego samego w Xamarin (Xamarin.ios / Monotouch), u mnie to działało:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(wymaga użycia UIKit;)

 5
Author: Daniele D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 19:51:16

I w przypadku, gdy potrzebujesz dostępu do rozszerzenia WatchKit delegate z kontrolera widoku na watchOS:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
 4
Author: Marco Miltenburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-03 20:56:12

Możesz dodać #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] do pliku Prefix.pch twojego projektu, a następnie wywołać dowolną metodę AppDelegate w dowolnym UIViewController z poniższym kodem.

[uAppDelegate showLoginView];
 2
Author: Ada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 13:56:09

Aktualizacja dla Swift 3.0 i wyższych

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

    print("someMethodInAppDelegate called")
}

Wywołanie powyższej metody z Kontrolera przez następujące czynności

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

    appDelegate.someMethodInAppDelegate()
}

Wyjście:

Tutaj wpisz opis obrazka

 2
Author: iajmeri43,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-05 05:01:49

Nawet jeśli technicznie wykonalne, nie jest dobrym podejściem. Kiedy mówisz: "ekran powitalny będzie miał przyciski dla każdego pokoju, które pozwolą Ci przejść do dowolnego punktu na przejściu." Więc chcesz przejść przez appdelegate, aby wywołać te kontrolery za pomocą zdarzeń tohc na przyciskach?

Takie podejście nie jest zgodne z wytycznymi Apple i ma wiele wad.

 0
Author: ingconti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 09:57:45