9

当您在文件中实现类的类别时,该类的所有实例是否默认都属于该类别?

我是 Objective-C 的新手,我正试图让我不可编辑的 UITextView 不可选择。我使用一个类别遇到了这个答案: https ://stackoverflow.com/a/8013538/1533240

其中有以下解决方案:

@implementation UITextView (DisableCopyPaste)

-(BOOL) canBecomeFirstResponder
{
    return NO;
}
@end

我将代码段添加到我的代码中,但它似乎不起作用,因为我仍然可以选择文本。我的声明UITextView是通常的:

titleLabel = [[UITextView alloc] initWithFrame:frame];

我尝试将声明更改为,[DisableCopyPaste alloc]但这似乎不起作用..哈哈。

谢谢!

4

3 回答 3

20

您误解了类别的意义。类别将方法添加到现有类。它们绝不能用于覆盖现有方法。这样做是未定义的行为(技术上仅在一种情况下未定义,但您无法预测这种情况,因此您必须假设它适用)。

如果需要覆盖方法,则必须子类化,而不是使用类别。请参阅您链接的问题的最佳答案。

于 2013-04-22T18:42:53.837 回答
6

当您在文件中实现类的类别时,该类的所有实例是否默认都属于该类别?

是的。如果您创建一个类别,该类别中的方法将添加到该类中。例如,如果您在 NSString 上创建一个返回字符串校验和的类别,您可以在任何NSString 实例上使用该方法。

我将代码段添加到我的代码中,但它似乎不起作用,因为我仍然可以选择文本。

不要使用类别来覆盖现有方法。

一方面,这是一种糟糕的形式。您正在以作者没有预料到的方式有效地改变类的行为。另一方面,您不能指望覆盖起作用-未定义将类别添加到类的顺序,因此您永远不知道是否会出现其他类别并替换您尝试替换的方法. 这根本不可靠。如果您需要覆盖方法,请创建一个子类。

于 2013-04-22T18:51:05.943 回答
0

What you need to do is to declare category in header .h file:

such as:

@interface UITextView (DisableCopyPaste)
-(BOOL) methodName
@end

then in .m define as

@implementation UITextView (DisableCopyPaste)
-(BOOL) methodName
{
    return NO;
}
@end

You can do two thing,

  1. You can write it in a class and import that to all classes you need this functionality.
  2. Or write these lines eachs .h and .m (respectively) you need it.
于 2013-04-22T18:47:48.720 回答