1. 程式人生 > >iOS子檢視捕獲到的touches如何讓父檢視響應

iOS子檢視捕獲到的touches如何讓父檢視響應

用代理實現最簡單了,子檢視宣告一個protocol和與之對應的method和delegate property,然後父檢視實現。
例如:
子檢視SonView.h:
@class SonView; //這個必不可少,因為真正的class interface在下面宣告,而在protocol宣告中又要用到這個class,所以提前告訴XCode有這麼一個class存在

@protocol SonViewTouchHandler <NSObject> //子檢視宣告protocol,只宣告介面,不實現

- (void)SonViewTouchDownPoint: (CGPoint)touchPoint from:(id)sender;

- (void)SonViewTouchUpPoint: (CGPoint)touchPoint from:(id)sender;

@end


@interface SonView : UIView

@property (nonatomic, weak) id <SonViewTouchHandler> sonViewTouchHandlerDelegate; //delegate property代理 property,子檢視用這個來訪問父檢視,這個變數的指向一般由父、子兩個檢視的建立者來設定

@end

父檢視DadView.m:
@interface DadView () <SonViewTouchHandler> //此處父檢視宣告自己實現子檢視的protocol


@end

@implementation DadView
//這兩個在子檢視protocol中宣告方法在父檢視中才真正實現,這就實現了子檢視在不需要了解父檢視的具體實現方法的情況下向父檢視傳送資訊,此處傳送的是子檢視上使用者觸控的位置資訊
- (void)sonViewTouchDownPoint: (CGPoint)touchPoint from:(id)sender
{
...
}
- (void)sonViewTouchUpPoint: (CGPoint)touchPoint from:(id)sender
{
...
}

@end

子檢視SonView.m

@implementation
//在子檢視被使用者觸控時呼叫父檢視代理處理觸控事件,把使用者觸控的位置資訊通過代理髮送給父檢視

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch * touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self];
[self.sonViewTouchHandlerDelegate sonViewTouchDownPoint: touchPoint from:self];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//類似上面只是使用另一個對應的method
}

@end

以上就是一個典型的利用代理從子檢視向父檢視傳值的具體實現方法。只要在合適的時候(一般是建立之後)把子檢視sonView.sonViewTouchHandlerDelegate設定為父檢視就可以了,如果子檢視是由父檢視建立的,則直接就是sonView.sonViewTouchHandlerDelegate = self就可以了