8

Nói rằng tôi có một bộ điều khiển xem chứa tùy chỉnh (MainViewController) nơi tôi làm điều gì đó như thế này:container Xem Bộ xử lý - thông báo cho cha mẹ hành động

- (void)viewDidLoad 
{ 
    [super viewDidLoad];   

    HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; 
    [self addChildViewController:homeVC]; 
    [self.view addSubview:homeVC.view]; 

} 

Các HomeViewController sẽ có một nút, chẳng hạn như "đi", đó khi nhấn sẽ cần phải tiến tới bộ điều khiển xem tiếp theo. Vì vậy, tôi cần phải thông báo cho MainViewController của hành động này. Cách tốt nhất để làm việc này là gì?

Tôi đang sử dụng vùng chứa tùy chỉnh vì tôi cần thực hiện chuyển đổi tùy chỉnh giữa các trình điều khiển chế độ xem. Khi "go" được nhấn, một số khung nhìn trên HomeViewController sẽ hoạt ảnh trong khi các khung nhìn từ trình điều khiển xem mới sẽ được làm động vào vị trí.

Rõ ràng tôi có thể cung cấp cho HomeViewController một thuộc tính của kiểu MainViewController và thực hiện cuộc gọi theo cách đó, nhưng tôi hy vọng rằng có một cách rõ ràng hơn với API bộ điều khiển xem bộ chứa.

Trả lời

15

Bạn có thể sử dụng đại biểu hoặc chặn;

Sử dụng đại biểu

Tạo một giao thức:

@protocol SomeProtocol <NSObject> 
- (void)someAction; 
@end 

Chỉ cần khai báo một delegate trong HomeViewController.h như thế này:

id<SomeProtocol> delegate; 

và sau đó trong viewDidLoad MainViewController của thiết lập nó như thế này :

homeVC.delegate = self; 
//some where in MainViewController implement the protocol method 
-(void)someAction 
{ 
    //do something 
} 

sau đó khi bạn nhấn nút ở homeVC, chỉ đơn giản là gọi:

if ([self.delegate respondsToSelector:@selector(someAction)]) { 
    [self.delegate someAction]; 
} 

Sử dụng Khối:

Trong HomeViewController.h tuyên bố một tài sản khối:

typedef void (^ActionBlock)(); 

@property (nonatomic, copy) ActionBlock block; 

sau đó trong MainViewController ViewDidLoad:

homeVC.block = ^(){ 
    //do something 
}; 

sau đó khi bạn nhấn nút ở homeVC, chỉ đơn giản là gọi:

self.block(); 
+0

ok, vì vậy không có gì tôi có thể tận dụng từ Containment API UIViewController là? – soleil

+0

Không chắc chắn bu bài đăng này có thể giúp [kiểm tra điều này] (http://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5) –

+1

Tôi muốn +1 3 lần nếu tôi có thể. Nó không chỉ trả lời cùng một câu hỏi cho tôi mà còn nâng cao hiểu biết của tôi về các khối mười lần :) – Pedro

10

Có một cách khác quá ... Mỗi bộ điều khiển xem có thuộc tính để sử dụng mà bạn có thể làm điều này ...

parentViewController

trong MainViewController xác định một phương pháp để hành động mà bạn muốn thực hiện ...

- (void)someMethod:(BOOL)someParam; 

Sau đó, trong HomeViewController bạn có thể làm ...

MainViewController* parent = (MainViewController*)[self parentViewController]; 
[parent someMethod:paramValue]; 

HTH :)

+2

Cách nhanh chóng và bẩn thỉu ở đây. Sử dụng câu trả lời đã chọn nếu bạn có thêm chút thời gian để tạo giao thức. Cảm ơn pedro! –

3

Đây là một mô hình rất phổ biến.Phụ huynh sẽ là cá thể thực tế sẽ xử lý hành động, bằng cách cung cấp và default extension.

Trong Swift 3:

Chánh view controller:

protocol SomeProtocol { 
    func foo() 
} 

extension ParentViewController: SomeProtocol { 
    func foo() { 
     // Parent handles it 
    } 
} 

Child view controller:

@IBAction func tapGo(_ sender: Any) { 
    (parent as? SomeProtocol)?.foo() 
} 
+0

Cảm ơn rất nhiều điều này chỉ là những gì tôi đang tìm :) – mic