2011-07-03 24 views
8

Đây có lẽ là một câu hỏi noob nhưng không thể có được đầu của tôi xung quanh nó.Xcode: Kết nối giữa View Controllers và App Delegate

Làm cách nào để tạo kết nối giữa 2 bộ điều khiển chế độ xem hoặc bộ điều khiển chế độ xem và appdelegate của tôi? những gì tôi thường làm là thêm dòng sau vào đại biểu ứng dụng của tôi "h" tập tin

@class RootViewController; 


@interface TabBarWithSplitViewAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 
    RootViewController *rootViewController; 



} 
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController; 

@end 

và sau đó tạo ra một kết nối trong giao diện Builder. từ bộ điều khiển xem gốc của tôi cho ứng dụng ủy nhiệm và tự động cho tôi biết rằng rootViewController mà tôi đã thêm ở trên.

và nếu bạn làm điều này trên các đại biểu ứng dụng "m" file:

#import "RootViewController.h" 

NSLOG(@"Controller %@",rootViewController); 

nó mang lại cho bạn một loạt các con số chỉ ra rằng có một kết nối

Nhưng như bạn biết với xcode 4 này thay đổi kể từ khi bạn thường không còn có main.xib nơi bạn có thể tạo kết nối, bạn thực hiện gần như tất cả các kết nối đó theo chương trình.

`ve thử tất cả mọi thứ từ việc sử dụng cùng một mã mà không có sự "IBOutlet" để nói thêm:

rootViewController = [[RootViewController]alloc] init; 

nhưng không có vẻ làm việc.

ai cũng có thể giúp bạn?

Cảm ơn trước

+0

Bạn đã xem thông báo chưa? Tôi đã không thử nó với XCode 4, nhưng nó có thể làm việc cho bạn. –

+0

không thể sử dụng thông báo vì tôi thực sự phải có sự giao tiếp giữa chúng. và thay đổi mọi thứ trên rootviewcontroller của tôi từ appdelegate! – Ponchotg

Trả lời

16

Về cơ bản, bạn muốn tạo một bộ điều khiển chế độ xem trong ứng dụng của mình.

ViewController *myVC; 
@property (nonatomic, retain) IBOutlet ViewController *myVC; 

sau đó tổng hợp nó trong tệp triển khai.

Sau đó, khi điều khiển xem tải, gọi một cái gì đó dọc theo dòng này:

- (void)viewDidLoad { 
    AppDelegateClass *appDelegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
    appDelegate.myVC = self; 
} 

Tại thời điểm này, bây giờ bạn có một kết nối trực tiếp để điều khiển xem của bạn từ các đại biểu ứng dụng. Tương tự, bạn có thể làm ngược lại để gọi các phương thức ủy nhiệm ứng dụng từ trình điều khiển khung nhìn. Trong trường hợp đó, bạn sẽ thiết lập một đại biểu trong tiêu đề của bộ điều khiển xem.

id delegate; 
@property (nonatomic, assign) id delegate; 

một lần nữa tổng hợp nó trong tệp triển khai.

Bây giờ khi bạn đang ở trong viewDidLoad, bạn muốn gọi một cái gì đó như thế này:

- (void)viewDidLoad { 
    self.delegate = (AppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
} 

Điều đó sẽ cung cấp cho bạn những gì bạn cần để có được đi, vì vậy tôi hy vọng rằng sẽ giúp

+2

Tôi biết đây là một chủ đề cũ nhưng tôi nghĩ rằng đây không phải là một câu hỏi riêng biệt thực sự: Tôi đã thử phần đầu tiên của bạn trả lời (kết nối viewController-> appDelegate) nhưng trên dòng 'appDelegate.myVC = self', Xcode nói '" Chuyển đổi ngầm định của một con trỏ Objective-C thành 'int *' không được phép với ARC "'. Câu trả lời của bạn không phải là ARC? Nếu vậy, bạn có thể vui lòng giúp tôi không? – tomsmeding

+0

Điều này được viết trước ARC, nhưng nó không bị ảnh hưởng bởi nó vì không có 'giữ lại' hoặc' phát hành' được gọi. Hãy chắc chắn rằng bạn có sẵn các hàm '@ property' đúng (trong trường hợp này, nó sẽ giống như đại diện id @property (nonatomic, strong)). Ngoài ra, đảm bảo bạn đang chuyển biến chính xác. Lỗi bạn đang nhận, cụ thể là phần 'int *' chắc chắn nên được xem xét. Một 'int' sẽ không bao giờ được chuyển thành một con trỏ, tức là' int * '. Tôi hy vọng rằng sẽ giúp – justin

Các vấn đề liên quan