iOS - Metode Memanggil Aplikasi Delegasi dari ViewController

248

Apa yang saya coba lakukan adalah mengklik tombol (yang dibuat dalam kode) dan meminta pemanggil tampilan pengendali yang berbeda kemudian menjalankan fungsi di pengendali tampilan baru.

Saya tahu ini bisa dilakukan dengan relatif mudah di IB tetapi itu bukan pilihan.

Contoh dari apa yang ingin saya lakukan adalah jika Anda memiliki dua pengontrol tampilan satu dengan layar splash rumah. Pengontrol tampilan lain memiliki jalan melalui rumah di bahwa Anda dapat pergi melalui semua kamar dalam urutan tertentu. Layar splash akan memiliki tombol untuk setiap kamar yang akan memungkinkan Anda untuk melompat ke titik mana pun saat berjalan.

Mytheral
sumber

Jawaban:

538

Anda dapat mengakses delegasi seperti ini:

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

Ganti MainClass dengan nama kelas aplikasi Anda.

Kemudian, asalkan Anda memiliki properti untuk pengontrol tampilan lainnya, Anda dapat memanggil sesuatu seperti:

[appDelegate.viewController someMethod];
Cristian Radu
sumber
12
mungkin juga perlu mengimpor file appDelegate.h di mana pun digunakan, atau melakukan @class appDelegate
Zaky German
3
File appDelegate.h adalah kandidat yang baik untuk masuk dalam file header IMO awalan / dikompilasi target.
mharper
48
Jika Anda mengimpor delegasi aplikasi Anda ke dalam Prefix.pch Anda seperti @mharper mengatakan Anda juga dapat menambahkan ini pada saat yang sama: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) yang kemudian memungkinkan Anda untuk mengakses delegasi aplikasi Anda seperti '[AppDelegate.viewController someMethod]'. Ini sedikit menyederhanakan, tetapi juga membuatnya lebih mudah untuk menyalahgunakannya.
Kenny Lövrin
setelah @end file delegate.h aplikasi saya, saya menambahkan #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) Sekarang, siapa pun yang mengimpor delegasi aplikasi dapat langsung menggunakan [AppDelegate.viewController someMethod]
harveyslash
43

Dan jika ada yang bertanya-tanya bagaimana melakukan ini di swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
canhazbits
sumber
jika biarkan appDelegate = UIApplication.sharedApplication (). delegate as? AppDelegate {} adalah pendekatan yang lebih baik di swift.
cbartel
@petrsyn Apa maksud delegasi itu nil? Bukankah itu sebuah aplikasi SELALU memiliki AppDelegate ?!
Sayang
Dalam versi terbaru Swift, sharedApplication()harus diganti dengan shared. yaitu, hapus "Aplikasi" dan tanda kurung. Jadi kode kerja penuh pada Swift 5.2 adalah: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota
41

Kedengarannya Anda hanya perlu UINavigationControllerpengaturan?

Anda bisa mendapatkan di AppDelegatemana saja dalam program melalui

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

Di delegasi aplikasi Anda, Anda harus memiliki pengaturan pengontrol navigasi Anda, baik melalui IB atau dalam kode.

Dalam kode, anggap Anda telah membuat viewcontroller 'Ikhtisar rumah' Anda sudah akan menjadi seperti ini di 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];

Setelah ini, Anda hanya perlu viewcontroller per 'kamar' dan aktifkan yang berikut saat acara klik tombol diambil ...

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

Saya belum menguji kode di atas jadi maafkan kesalahan sintaksis tapi semoga kode semu membantu ...

Sradforth
sumber
8
Jawaban Anda juga benar, saya akhirnya menggunakan kombinasi jawaban Cristian dan jawaban Anda. Saya berharap saya bisa membagi tanda centang.
Mytheral
15

Beginilah cara saya melakukannya.

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

Jangan lupa impor.

#import "AppDelegate.h"
mikemike396
sumber
13

Ikuti saja langkah-langkah ini

1. impor delegasi aplikasi Anda di kelas Anda di mana Anda ingin objek delegasi aplikasi.

#import "YourAppDelegate.h"

2.di dalam kelas Anda buat instance objek delegasi aplikasi Anda (Pada dasarnya singleton).

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

3.Sekarang panggil metode menggunakan pemilih

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

        [appDelegate yourMethod];
    }

atau langsung oleh

[appDelegate yourMethod];

untuk cepat

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

saya akan merekomendasikan yang pertama. Jalankan dan Pergi.

Tunvir Rahman Tusher
sumber
ini secara khusus BUKAN contoh baru dari delegasi, tetapi mengambil kembali delegasi singleton dari aplikasi singleton
Ammo Goettsch
11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

Itu menghindari harus menyertakan AppDelegate.h Anda di mana-mana. Ini adalah pemeran sederhana yang bisa bertahan lama, memungkinkan untuk mengembangkan Kontroler independen dan menggunakannya kembali di tempat lain tanpa perlu khawatir tentang nama kelas dan seterusnya ...

Nikmati

bruno.yvan.morel
sumber
Terima kasih telah berbagi, ini membuat saya senang selama beberapa menit, mungkin ini akan berhasil, tetapi bagaimana jika saya ingin menggunakan metode seperti visibleViewController darinya? Ini akan memberikan kesalahan seperti ini: Properti 'visibleViewController' tidak ditemukan pada objek tipe 'NSObject <UIApplicationDelegate> *. ada solusi untuk ini?
mgyky
8

Banyak jawaban bagus sudah ditambahkan. Meskipun saya ingin menambahkan sesuatu yang paling cocok untuk saya.

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

dan itu saja. Gunakan di seluruh aplikasi seperti konstanta.

misalnya

[kAppDelegate methodName];

Jangan lupa untuk mengimpor file AppDelegate.h Anda dalam file .pch atau macro yang sesuai.

ZaEm ZaFaR
sumber
7

Jika seseorang memerlukan hal yang sama di Xamarin (Xamarin.ios / Monotouch), ini bekerja untuk saya:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Perlu menggunakan UIKit;)

Daniele D.
sumber
Pernyataan yang benar di Swift adalah membiarkan appdel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
Phil
5

Dan jika Anda memerlukan akses ke delegasi ekstensi WatchKit Anda dari pengontrol tampilan di watchOS:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
Marco Miltenburg
sumber
5

Pembaruan untuk Swift 3.0 dan lebih tinggi

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

    print("someMethodInAppDelegate called")
}

memanggil metode di atas dari controller Anda dengan mengikuti

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

    appDelegate.someMethodInAppDelegate()
}

Keluaran:

masukkan deskripsi gambar di sini

iAj
sumber
3

Anda dapat menambahkan #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]dalam proyek Anda Prefix.pchfile tersebut dan kemudian memanggil metode apapun dari Anda AppDelegatedalam UIViewControllerdengan kode di bawah ini.

[uAppDelegate showLoginView];
Ada
sumber
0

Bahkan jika secara teknis layak, BUKAN pendekatan yang baik. Ketika Anda mengatakan: "Layar splash akan memiliki tombol untuk setiap kamar yang akan memungkinkan Anda untuk melompat ke titik mana pun saat berjalan." Jadi Anda ingin melewati appdelegate untuk memanggil pengontrol ini melalui acara tohc pada tombol?

Pendekatan ini tidak mengikuti pedoman Apple dan memiliki banyak kelemahan.

ingconti
sumber
Lihatlah tanggal pada pertanyaan ... Itu dari belakang ketika Interface Builder adalah aplikasi yang terpisah dan pengembangan adalah binatang yang sangat berbeda. Saya sudah bertahun-tahun tidak menyentuh pengembangan iOS sehingga saya tidak bisa mengevaluasi jawaban yang lebih modern.
Mytheral
itu bisa ... tapi pertimbangan saya masih berlaku
ingconti
0

Pada tahun 2020, iOS13, xCode 11.3. Apa yang berfungsi untuk Objective-C adalah:

#import "AppDelegate.h"

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

Ini bekerja untuk saya, saya harap sama untuk Anda! : D

Breno Medeiros de Oliveira
sumber