1

UITextViewサブクラスがあります。UITextViewクラスには、次のようないくつかのデリゲートプロトコルがあります

- (void)textViewDidChange:(UITextView *)textView;
- (void)textViewDidBeginEditing:(UITextView *)textView;

カスタムクラスのものと同じように使用したいと思います。つまり、クラスからMyCustomTextViewClassを使用する場合(classXと呼びます)、これを実行してデリゲートを設定する必要があります。

MyCustomTextViewClass *box = [[MyCustomTextViewClass alloc] initWithFrame:
                                   CGRectMake(111.0f, 123.0f, 190.0f, 50.0f)];
// ... bla bla.. set other parameters
[box setDelegate:self];

しかし、デリゲートを設定するには、を使用してclassXを宣言する必要があります

<MyCustomTextViewClassDelegate>

そのためには、UITextViewのデリゲートプロトコルをMyCustomTextViewClassに追加する必要があります。

どうすればそれを正しく行うことができますか?

MyCustomTextViewClassでこれを行うだけですか?

@protocol MyCustomTextViewClassDelegate <NSObject>
@optional
- (void)textViewDidChange:(MyCustomTextViewClass *)textView;
- (void)textViewDidBeginEditing:(MyCustomTextViewClass *)textView;
@end

??? これがUITextViewからデリゲートプロトコルを転送する方法がわかりません...

助けてくれてありがとう。

4

2 に答える 2

0

編集:新しい答え。UITextViewサブクラスは、独自のデリゲートプロトコルを宣言する必要がないことを理解してください。これは次のように機能します。すべての長方形が正方形であるとは限りませんが、すべての正方形は長方形です。MyCustomTextViewは、UITextViewが応答するすべてのメッセージに対して動作および応答し、UITextViewと同じようにデリゲートにメッセージを送信します。UITextViewでカバーされていないデリゲートメソッドを追加したい場合は、まったく新しいプロトコルを作成します。

とにかく、UITextViewをサブクラス化する必要がある理由を考えてください。文字を数えるラベルのように、それにサブビューを追加していますか?その場合、サブクラス化すると便利です。UITextViewを作成し、公開されているプロパティの一部を変更するだけの場合、カスタムサブクラスはやり過ぎかもしれません。私が尋ねる理由は、この質問はあなたがオブジェクトの継承を完全に理解していないように見えるからです。ここでジャークや何かになろうとはしていません、私はあなたを助けたいです。

とにかく、コードに:

//===================================
//ClassX.h
//===================================
#import "MyCustomTextView.h"

@interface ClassX : UIViewController <UITextViewDelegate>

-(void)loadTextView;

@property (nonatomic, strong) MyCustomTextView *customTextView;

@end
//===================================
//ClassX.m
//===================================
#import "ClassX.h"

@implementation ClassX
@synthesize customTextView;

-(void)loadTextView {
    if (!customTextView) {
        self.customTextView = [[MyCustomTextView alloc] initWithFrame:CGRectZero];
    customTextView.delegate = self;
    }
    customTextView.publicString = @"Public String Property!";    
}

#pragma mark UITextViewDelegate

-(void)textViewDidChange:(UITextView *)textView {
    if (textView == customTextView) {
        //THIS IS CALLED A CAST :
        MyCustomTextView *castedVariable = (MyCustomTextView *)textView;
        //now the object castedVariable will be treated as a MyCustomTextView object
        //so you can access methods and variables declared by the class
        textView.publicString = @"Hello World!"; //XCode raises an error, UITextView doesn't have this property
        castedVariable.publicString = @"Hello World!"; //this works fine
        //handle textViewDidChange method
        //you are now interacting with self.customTextView
    } else {
        //is your ClassX also in charge of 
        //a different UITextView? Handle here
    }

}
于 2012-09-07T02:46:22.217 に答える
0

あなたの質問は少し不明確です。MyCustomTextViewClassメソッドを実装したいだけの場合はUITextViewDelegate、それを宣言するだけです。

@class MyCustomTextViewClass : UITextView <UITextViewDelegate> {
...
}

作成している新しいプロトコルがあり、新しいプロトコルとの両方を実装するクラスがある場合は、UITextViewDelegate次のように両方を実装するように宣言できます。

@class MyDelegateClass : NSObject <UITextViewDelegate, MyCustomTextViewClassDelegate> {
...
}

MyCustomTextViewClassDelegateと同じメソッドをすべて必要とする場合はUITextViewDelegate、次のように、そのプロトコルから継承するものとして宣言します。

@protocol MyCustomTextViewClassDelegate <UITextViewDelegate> {
...
}
于 2012-09-07T02:01:52.073 に答える