iOS - Phương thức gọi đại biểu ứng dụng từ ViewContoder


248

Những gì tôi đang cố gắng làm là nhấp vào một nút (được tạo bằng mã) và yêu cầu nó gọi một bộ điều khiển khung nhìn khác sau đó để nó chạy một chức năng trong bộ điều khiển chế độ xem mới.

Tôi biết nó có thể được thực hiện tương đối dễ dàng trong IB nhưng đó không phải là một lựa chọn.

Một ví dụ về những gì tôi muốn làm sẽ là nếu bạn có hai bộ điều khiển xem một với màn hình giật gân của ngôi nhà. Bộ điều khiển xem khác đã đi bộ qua ngôi nhà trên đó mà bạn có thể đi qua tất cả các phòng theo thứ tự được thiết lập. Màn hình giật gân sẽ có các nút cho mỗi phòng cho phép bạn nhảy đến bất kỳ điểm nào trên đường đi bộ.

Câu trả lời:


538

Bạn có thể truy cập vào đại biểu như thế này:

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

Thay MainClass bằng tên của lớp ứng dụng của bạn.

Sau đó, miễn là bạn có một thuộc tính cho trình điều khiển xem khác, bạn có thể gọi một cái gì đó như:

[appDelegate.viewController someMethod];

12
cũng có thể cần phải nhập tệp appDelegate.h bất cứ nơi nào nó được sử dụng hoặc làm @ class appDelegate
Zaky German

3
Tệp appDelegate.h là một ứng cử viên tốt để đi vào tệp tiêu đề tiền tố / tiền biên dịch trước của mục tiêu IMO.
mharper

48
Nếu bạn nhập đại biểu ứng dụng của mình trong Prefix.pch như @mharper nói rằng bạn cũng có thể thêm ứng dụng này cùng lúc: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) sau đó cho phép bạn truy cập ứng dụng của mình '[AppDelegate.viewControll someMethod]'. Nó đơn giản hóa nó một chút, nhưng nó cũng làm cho việc lạm dụng nó dễ dàng hơn.
Kenny Lövrin

sau khi @end file delegate.h ứng dụng của tôi, tôi đã thêm #define appdelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) Bây giờ bất cứ lớp nhập khẩu ứng dụng đại biểu có thể trực tiếp sử dụng [AppDelegate.viewController someMethod]
harveyslash

43

Và nếu bất cứ ai đang tự hỏi làm thế nào để làm điều này trong swift:

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

if let appDelegate = UIApplication. SharedApplication (). ủy nhiệm là? AppDelegate {} là một cách tiếp cận tốt hơn trong swift.
cbartel

@petrsyn Ý bạn là đại biểu có thể là nilgì? Không phải là một ứng dụng LUÔN LUÔN có AppDelegate sao?!
Mật ong

Trong các phiên bản gần đây của Swift, sharedApplication()nên được thay thế bằng shared. tức là xóa "Ứng dụng" và dấu ngoặc đơn. Vì vậy, mã làm việc đầy đủ kể từ Swift 5.2 sẽ là: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota

41

Âm thanh như bạn chỉ cần một UINavigationControllerthiết lập?

Bạn có thể nhận được AppDelegatebất cứ nơi nào trong chương trình thông qua

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

Trong đại biểu ứng dụng của bạn, bạn nên thiết lập bộ điều khiển điều hướng, thông qua IB hoặc bằng mã.

Trong mã, giả sử bạn đã tạo bộ điều khiển khung nhìn 'Tổng quan về ngôi nhà' của mình, nó sẽ giống như thế này trong 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];

Sau này, bạn chỉ cần một trình điều khiển chế độ xem cho mỗi 'phòng' và gọi như sau khi một sự kiện nhấn nút được chọn ...

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

Tôi đã không kiểm tra mã trên để tha thứ cho bất kỳ lỗi cú pháp nào nhưng hy vọng mã giả sẽ giúp ích ...


8
Câu trả lời của bạn cũng đúng, cuối cùng tôi đã sử dụng kết hợp câu trả lời của Cristian và câu trả lời của bạn. Tôi ước tôi có thể chia dấu kiểm.
Mytheral

15

Đây là cách tôi làm điều đó.

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

Đừng quên nhập khẩu.

#import "AppDelegate.h"

13

Chỉ cần làm theo các bước sau

1. nhập khẩu đại biểu ứng dụng của bạn trong lớp nơi bạn muốn đối tượng ủy nhiệm ứng dụng.

#import "YourAppDelegate.h"

2. bên cạnh lớp của bạn tạo một thể hiện của đối tượng ủy nhiệm ứng dụng của bạn (Về cơ bản nó là một singleton).

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

3. Bây giờ gọi phương thức bằng cách sử dụng bộ chọn

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

        [appDelegate yourMethod];
    }

hoặc trực tiếp bởi

[appDelegate yourMethod];

cho nhanh

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

tôi sẽ giới thiệu cái đầu tiên Chạy và đi.


đây đặc biệt KHÔNG phải là một ví dụ mới của đại biểu, mà là truy xuất đại biểu đơn của ứng dụng đơn
Ammo Goettsch

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

Nó tránh phải bao gồm AppDelegate.h của bạn ở mọi nơi. Đó là một dàn diễn viên đơn giản đi một chặng đường dài, cho phép phát triển Bộ điều khiển độc lập và tái sử dụng chúng ở nơi khác mà không phải lo lắng về tên lớp, v.v.

Thưởng thức


Cảm ơn bạn đã chia sẻ, điều này làm tôi vui trong vài phút, thật may là nó sẽ hoạt động theo cách nào đó, nhưng nếu tôi muốn sử dụng một phương thức như viewerViewContoder từ nó thì sao? Nó sẽ đưa ra lỗi như thế này: Không tìm thấy thuộc tính 'viewerViewContoder' trên đối tượng thuộc loại 'NSObject <UIApplicationDelegate> *. giải pháp nào cho việc này?
mgyky

8

Rất nhiều câu trả lời tốt đã được thêm vào. Mặc dù tôi muốn thêm một cái gì đó phù hợp với tôi hầu hết thời gian.

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

và đó là nó. Sử dụng nó trong suốt ứng dụng giống như một hằng số.

ví dụ

[kAppDelegate methodName];

Đừng quên nhập yourAppDelegate.h trong tệp .pch hoặc macro tương ứng.


7

Nếu ai đó cần điều tương tự trong Xamarin (Xamarin.ios / Monotouch), thì điều này có hiệu quả với tôi:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Yêu cầu sử dụng UIKit;)


Tuyên bố chính xác trong Swift là hãy để appdel: AppDelegate = UIApplication. Shared.delegate as! AppDelegate
Phil

5

Và trong trường hợp bạn cần quyền truy cập vào đại biểu tiện ích mở rộng WatchKit của mình từ bộ điều khiển xem trên watchOS:

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

5

Cập nhật cho Swift 3.0 trở lên

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

    print("someMethodInAppDelegate called")
}

gọi phương thức trên từ bộ điều khiển của bạn bằng cách làm theo

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

    appDelegate.someMethodInAppDelegate()
}

Đầu ra:

nhập mô tả hình ảnh ở đây


3

Bạn có thể thêm #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]vào Prefix.pchtệp dự án của bạn và sau đó gọi bất kỳ phương thức nào của bạn AppDelegatebằng bất kỳ UIViewControllermã nào dưới đây.

[uAppDelegate showLoginView];

0

Ngay cả khi khả thi về mặt kỹ thuật, KHÔNG phải là một cách tiếp cận tốt. Khi bạn nói: "Màn hình giật gân sẽ có các nút cho mỗi phòng cho phép bạn nhảy đến bất kỳ điểm nào trên đường đi bộ." Vì vậy, bạn muốn thông qua appdelegate để gọi các bộ điều khiển này thông qua các sự kiện tohc trên các nút?

Cách tiếp cận này không tuân theo hướng dẫn của Apple và có nhiều nhược điểm.


Nhìn vào ngày trên câu hỏi ... Đó là từ khi trở lại khi Interface Builder là một ứng dụng riêng biệt và sự phát triển là một con quái vật rất khác. Tôi đã không chạm vào sự phát triển của iOS trong nhiều năm vì vậy tôi không thể đánh giá các câu trả lời hiện đại hơn.
Mytheral

nó có thể .. nhưng những cân nhắc của tôi vẫn còn hiệu lực
ingconti

0

Năm 2020, iOS13, xCode 11.3. Những gì đang làm việc cho Objective-C là:

#import "AppDelegate.h"

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

Nó làm việc cho tôi, tôi hy vọng như vậy với bạn! : D

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.