直接
MyViewController
のメソッドを宣言-popupView:
しMyViewController.h
ます。
#import
MyViewController.h
でCustomUIView.m
。
CustomUIView
の [1] インスタンスへの参照を与えます。MyViewController
たとえば、@property
宣言された in を使用しCustomUIView.h
ます。
の場合(1)
、(の) は次のようになります。@interface
MyViewController
MyViewController.h
@interface MyViewController : UIViewController
{
//....
}
- (void)popupView:(NSString *)urlText;
//....
@end
の場合(2)
、UIViewController.m
上部のどこかに次のものが必要です
#import "CustomUIView.h"
#import "MyViewController.h"
の場合(3)
、@interface
inCustomUIView.h
は次のようになります
@interface CustomUIView : UIView
{
//....
}
@property (nonatomic, weak) MyViewController *viewController;
@end
CustomUIView
このプロパティは、所有者のインスタンスが作成された後、しばらくしてから設定する必要がありますMyViewController
。にある場合CustomUIView
は、次のようにプロパティの宣言にMyViewController.xib
キーワードを追加することで、このプロパティを設定できますIBOutlet
@property (nonatomic, weak) IBOutlet MyViewController *viewController;
で、このプロパティを「ファイルの所有者」にポイントしXIB
ます。代わりにCustomUIView
プログラムで作成する場合は、初期化後すぐにこのプロパティを設定できます。
デリゲート
ただし、これはベスト プラクティスとは言えません。デリゲート パターンを使用する方がはるかに優れています。これを行うには、次のことが必要です。
- デリゲートプロトコルを定義します。
- に「デリゲート」
@property
を追加しCustomUIView
ます。
- 適切なタイミングでデリゲート オブジェクトのデリゲート メソッドを呼び出します。
- でプロトコルを実装します
MyViewController
。
@property
インスタンスがCustomUIView
所有するインスタンスの「デリゲート」をインスタンスに設定MyViewController
しMyViewController
ます。
デリゲート プロトコルを のような想像上のものと呼びましょうCustomUIViewDelegate
。の場合、次のよう(1)
に の先頭で宣言しCustomUIView.h
ます。
@class CustomUIView;
@protocol CustomUIViewDelegate <NSObject>
- (void)customUIView:(CustomUIView *)customView didSelectURLText:(NSString *)urlText;
@end
コンパイラがプロトコル メソッドの最初の引数の型を理解できるように、クラスを前方宣言する必要があることに注意してください。CustomUIView
customUIView:didSelectURLText:
については、上記と非常によく似(2)
た処理を行います。(3)
CustomUIView
@interface
@interface CustomUIView : UIView
{
//....
}
@property (nonatomic, weak) id<CustomUIViewDelegate> *delegate;
@end
繰り返しになりますが、Interface Builder でこのプロパティを設定する場合は、IBOutlet
キーワードを使用して IB に通知する必要があります。
@property (nonatomic, weak) IBOutlet id<CustomUIViewDelegate> *delegate;
(3) については、適切なタイミングでcustomUIView:didSelectURLText:
デリゲート オブジェクトのデリゲート メソッドを呼び出す必要があります。self.delegate
あなたの質問で、あなたは書いた
デリゲートを使用して、UIWebView オブジェクトの URL ハイパーリンクのクリックをオーバーライドすることができました。
CustomUIView
それで、インスタンスメソッドがあるとしましょう
- (void)didSelectURL:(NSURL *)url
{
//....
}
ユーザーが UIWebView でリンクを選択したときに呼び出すものです。のCustomUIView
デリゲートには、次のことを通知する必要があります。
- (void)didSelectURL:(NSURL *)url
{
//...
if ([self.delegate respondsToSelector:@selector(customUIView:didSelectURLText:)]) {
{
[self.delegate customUIView:self didSelectURLText:url.absoluteString];
}
}
CustomUIView
インスタンスのデリゲート オブジェクトが対象のセレクター ( customUIView:didSelectURLText:
) を呼び出して実装しているかどうかを最初に確認することに注意してくださいrespondsToSelector:
。
の場合、最初にの宣言を追加し、シンボルを使用するファイルに必ず追加する(4)
必要があります。は次のようになります。<CustomUIViewDelegate>
MyViewController
@interface
#import
CustomUIView.h
CustomUIViewDelegate
MyViewController
@interface
#import "CustomUIView.h"
@interface MyViewController : UIViewController <CustomUIViewDelegate>
{
//....
}
//....
@end
さらに重要なことに、の;にプロトコルを実装する必要があります。これまでのところ、がそれを採用していると宣言しただけです。CustomUIViewDelegate
MyViewController
@implementation
MyViewController
これを行うには、プロトコルが 1 つのメソッドのみで構成されているため、独自の実装を追加するだけで済みます-customUIView:didSelectURLText:
。MyViewController
は次の@implementation
ようになります。
#import "MyViewController.h"
@implementation MyViewController
//....
- (void)popupView:(NSString *)urlText
{
//....
}
#pragma mark - CustomUIViewDelegate
- (void)customUIView:(CustomUIView *)customView didSelectURLText:(NSString *)urlText
{
[self popupView:urlText];
}
//....
@end
最後に、インスタンスが所有するインスタンスのプロパティ(5)
を設定する必要があります。とそのインスタンスとの関係について、これを決定的に行う方法を説明するのに十分な知識はありませんが、例を示します。したがって、の実装は次のようになります。delegate
CustomUIView
MyViewController
MyViewController
CustomUIView
-[MyViewController loadView]
CustomUIView
MyViewController
-loadView
- (void)loadView
{
[super loadView];
//....
CustomUIView *customView = //....
//....
[self.view addSubview:customView];
//....
}
この時点で行うことdelegate
@property
は、ローカル変数のcustomView
をに設定することだけself
です。
customView.delegate = self;
編集CustomUIView
:との関係に関する新しい情報に照らして (5) を更新しましたMyViewController
。
CustomUIView
あなたのコメントでは、あなたのサブビューとしてあなたが追加されたと書いていますcvc.view
where cvc
is an instance of CustomUIViewController
in CustomUIView
's method -[CustomUIView show]
。customView.delegate = self;
このため、書き込みは書き込みと同じであることに注意してself.delegate = self
ください。これは明らかにあなたがやりたいことではありません。
CustomUIView
のdelegate
プロパティを のインスタンスに設定しますMyViewController
。したがって、メソッド-[CustomUIView show]
は次のようになります
- (void)show
{
//....
[cvc.view addSubview:self];
self.delegate = mvc;
}
mvc
のインスタンスはどこにありますかMyViewController
。