[英]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.