我创建了一个包装UITextView并添加了一些UI元素的类。我希望新类的API与UITextView相同,因此我使用消息转发(下面列出)来在封装的文本视图和委托之间中继消息。在做邮件转发时避免编译器警告
令人烦恼的是,编译器针对我的转发类的实例发出方法调用的警告。例如,将用于下面的行中产生一个错误:
[aMyTextView setContentOffset:CGPointZero animated:YES];
所以我不得不声明并创建“手动转发”用于这些方法中,这违背了使用消息转发的全部目的的实现。
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
{
[_textView setContentOffset:contentOffset animated:animated];
}
我知道避过这是使用的performSelector:
方法之一的常用方法,但是这是一个)累赘时,一些参数不是NSObjects(虽然Erica Sadun's extensions是一个很大的帮助),B)再次,完全违背了创建透明包装的意图。
(子类UITextView中也出了问题,因为我需要插入文本视图下方的意见。)
有没有办法来解决这个问题?
类的所有相关部分的清单:
@interface MyTextField : UIView<UITextViewDelegate>
{
UIImageView* _border;
UITextView* _textView;
UIButton* _clearButton;
NSObject<UITextViewDelegate>* _delegate;
}
@implementation MWTextField
. . .
// Forwards messages in both directions (textView <--> delegate)
#pragma mark Message forwarding
// Protocol messages will only be sent if respondsToSelector: returns YES
- (BOOL)respondsToSelector:(SEL)aSelector
{
if ([_delegate respondsToSelector:aSelector])
return YES;
else
return [super respondsToSelector:aSelector];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
// First, try to find it in the UITextView
if ([_textView respondsToSelector:selector])
{
return [_textView methodSignatureForSelector:selector];
}
// Then try the delegate
else if ([_delegate respondsToSelector:selector])
{
return [_delegate methodSignatureForSelector:selector];
}
else
{
return [super methodSignatureForSelector: selector];
}
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
SEL aSelector = [invocation selector];
if ([_textView respondsToSelector:aSelector])
{
[invocation invokeWithTarget:_textView];
}
else if ([_delegate respondsToSelector:aSelector])
{
[invocation invokeWithTarget:_delegate];
}
else
{
[self doesNotRecognizeSelector:aSelector];
}
}
. . .
@end
您的解决方案:很好,但更好,不必声明方法,只需转发它们,无论它们是什么。 子类化:我想用一些元素来组合实际的文本字段,其中至少有一个元素必须出现在*文本字段下。如果我继承UITextField,那么我只能将其作为子视图添加到其他视图中,这意味着它们将位于文本字段的顶部。我想我可以修改drawRect:...这是你会建议的吗?或者你有什么袖子? – Felixyz 2010-02-14 00:44:15
但是,当你的意思是,你们如何在没有警告和警告的情况下纠正转发?转发非常活跃。至于子类化,你可以在你的子类中做任何你在自定义类中做的事情。 – bbum 2010-02-14 03:23:10
你当然是对的。如果我做出这些警告,那么所有其他警告都会消失,这并不好。所以你的协议解决方案似乎是最好的。子类本身不能放置视图(根据绘制顺序),因为该视图将是子视图,并且总是在父视图之上分层。对? – Felixyz 2010-02-14 03:28:27