2013-10-21 37 views
1

我已經編寫了第三方框架,它在調用應用程序的現有視圖之上顯示UIView,即,應用程序調用框架/ SDK,並且SDK在其上顯示UIView目前正在屏幕上查看。消息以UIView作爲委託傳遞

這是通過使用代表完成的。該應用程序將當前視圖設置爲框架的委託。該框架然後使用該委託,並使用代碼添加自己的UIView作爲一個子視圖:

[[self delegate] addSubview:myVc.view]; 

其中myVc是的ViewController的框架。

現在我需要傳遞一個方法回調用應用程序說視圖顯示在屏幕上。因爲委託是一個UIView,我如何將消息傳遞給調用類?

我之所以要求使用UIView委託,是因爲我的UIView只佔用屏幕的一部分,我需要屏幕的其他部分來顯示應用程序的其餘部分並處於活動狀態。當我使用ViewController作爲代理時,它導致屏幕的另一部分變成黑色而不是透明。

所以我的問題是如何將消息傳遞給調用應用程序,該應用程序調用SDK並將其視圖設置爲委託。謝謝

回答

0

你可以發佈調用者偵聽的通知,或者你可以接受一個塊作爲調用者的參數,並在顯示視圖時執行該參數。

+0

我無法控制應用程序。所以不能使用通知選項。你能詳細說明一下嗎?謝謝 –

+0

不管你做什麼,調用你的框架的部分都必須實現當你告訴它動作完成時有反應的東西。在我提到的選項中,它可以偵聽通知,或者可以傳入爲呼叫者執行的某些代碼(塊)。如果您需要更多關於塊如何工作的信息,請嘗試使用Apple的在線Objective-C文檔。但是,無論你「發送」什麼,都必須準備好「接收」它。 –

0

如果我理解正確你的問題,那麼你只需要定義協議:

.H

@protocol YourFrameWorkViewDelegate <NSObject> 
    - (void)yourFrameWorkViewDidAppear; 
@end 

@interface YouFrameWorkView : UIView 
@property (weak, nonatomic) id <YourFrameWorkViewDelegate> delegate; 
@end 

.M

@implementation YouFrameWorkView 
- (void)didMoveToWindow 
{ 
    if ([self.delegate respondsToSelector:@selector(yourFrameWorkViewDidAppear)]) { 
    [self.delegate yourFrameWorkViewDidAppear]; 
    } 
} 
@end 

或者你可以從你的VC喜歡打電話委託

- (void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:animated]; 
if ([self.view.delegate respondsToSelector:@selector(yourFrameWorkViewDidAppear)]) { 
    [self.view.delegate yourFrameWorkViewDidAppear]; 
} 

當然,任何想要使用框架工作的應用程序都需要實現該協議。這可能是rootVCs視圖必須是子類和實現您的協議。這是標準做法。希望它有幫助。

您的評論後,追問:

Masure這種觀點實現的協議

.H

@interface ViewThatUsesYourFrameWork : UIView <YourFrameWorkViewDelegate> 

@end 

.M

@implementation ViewThatUsesYourFrameWork 

- (void)yourFrameWorkViewDidAppear 
{ 

} 
@end 

,並確認該委託確實設置。 致電之前respondsToSelector

if(!self.delegate)NSLog(@"Delegate is not set") 
+0

我現在已經實施了這個。不幸的是,我得到UIView無法響應選擇器錯誤。 –

+0

根據您的評論添加了一些跟進我的回答 – stringCode