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 回答