簡體   English   中英

如何從UIView子類調用UIViewController方法

[英]How can I call a UIViewController method from an UIView subclass

我正在開發適用於iPad的iOS應用程序。 我有一個UIView子類,我想從該子類調用ViewController的方法。 我試圖編寫一個委托代碼,但它不起作用。 這是一個很好的解決方案還是我必須以另一種方式做到這一點?

試試塊,這里是樣本:

MyView.h

@interface MyView: UIView 
...
@property (nonatomic, copy) void(^myEventCallBack)(id someData);
...
@end

MyView.m(如何調用塊樣本)

...

- (IBAction)buttonTapped:(UIButton *)sender {
   if (self.myEventCallback) {
       self.myEventCallback(self.someImportantData);
   }
}

...

在你的UIViewController中:

self.myView = [[MyView alloc] initWithFrame:someFrame];

// THIS IS VERY IMPORTANT, USE __weak COPY OF YOUR UIViewController OBJECT (owner of object which contains block) INSIDE BLOCK TO PREVENT RETAIN CIRCLE, CAUSE BLOCK RETAINS ITS CONTENT
__weak MyViewController *self_ = self;
self.myView.myEventCallback = ^(id someData){
    [self_ doSomeProcessingWithData:someData];
};

也可以使用帶有返回值的塊,示例:

@property (nonatomic, copy) BOOL(^shouldStartProcessing)(void);

self.myView.myEventCallback = ^BOOL{
    return (self_.state == MyViewControllerStateReady);
};

一般來說,概念上“遠程”對象之間的通信問題很棘手,但它是Cocoa編程的核心。 從一個實例到另一個實例的引用至關重要! 我在這里討論一般問題:

http://www.apeth.com/iOSBook/ch13.html#_instance_visibility

這是一種可能性。 如果此UIView實例位於接口中,則其nextResponder是視圖控制器,或者它是nextResponder的子視圖,其nextResponder是視圖控制器。 此外,視圖層次結構與響應者鏈平行。 因此,只需走上響應鏈,直到您進入視圖控制器。

UIResponder* r = someView; // the view instance, living in the interface
while (![r isKindOfClass:[UIViewController class]])
    r = [r nextResponder];

現在r是視圖控制器。 現在轉換為您所知道的實際視圖控制器的類,您將能夠在其上調用方法:

MyViewController* vc = (MyViewController*)r;

這是我的書對響應者鏈的總結:

http://www.apeth.com/iOSBook/ch11.html#_the_responder_chain

但是,還有許多其他可能性。 正如有人已經建議的那樣,你可以通過NSNotification(shoutcasting)建立通信線路; 它很難看,但確實有效,而且它的部分目的只是為了掩蓋這種棘手的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM