如何使用Objective-C分类

9

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

我刚接触Objective-C,正在尝试使我的不可编辑UITextView不可选择。我看到了这个答案,使用了一个类别:https://dev59.com/-XM_5IYBdhLWcg3wUxZB#8013538

其中包含以下解决方案:

@implementation UITextView (DisableCopyPaste)

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

我将这段代码添加到了我的程序中,但好像并没有起作用,因为我仍然可以选择文本。我的 UITextView 的声明如下:

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

我尝试更改声明为 [DisableCopyPaste alloc],但似乎无效.. 哈哈。

谢谢!


请编辑您的问题,更具体地描述“但似乎它没有起作用”的情况。 - jscs
@JoshCaswell 抱歉!我让它更加清晰了。 - corgichu
这可能不是你问题的答案,但我在这里的回答可能会让你更好地理解objective-c categories。http://stackoverflow.com/questions/12260729/class-files-of-obj-c-interface/12262379#12262379 - Popeye
3个回答

20

你误解了分类的作用。分类是为现有类添加方法而不应用于覆盖现有方法。这样做是未定义的行为(在技术上只有在一种情况下是未定义的,但你无法预测该情况,因此必须假设它适用)。

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


哦,好的。谢谢!我只是想看看能否不创建一个新类,因为那个答案得到了很多票,所以我想试一试。 =P 非常感谢您的见解!我可能会选择使用子类。 - corgichu

6
当你在文件中实现类的一个分类时,该类的所有实例默认都属于该分类吗?
是的。如果你创建了一个分类,该分类中的方法将被添加到该类中。例如,如果你在NSString上创建了一个返回字符串校验和的分类,你可以在任何NSString实例上使用该方法。
我将代码片段添加到我的代码中,但似乎它并没有起作用,因为我仍然可以选择文本。 不要使用分类来覆盖现有的方法。

首先,这样做是不好的。你实际上改变了类的行为,而这种改变可能会让作者感到意外。其次,你不能保证覆盖方法一定有效--添加类别的顺序是没有定义的,因此你永远不知道其他类别是否会替换你试图替换的方法。它不可靠。如果需要覆盖方法,请创建一个子类。


0
你需要做的是在头文件 .h 中声明 category,例如:
@interface UITextView (DisableCopyPaste)
-(BOOL) methodName
@end

然后在.m中定义为

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

你可以做两件事情,

  1. 你可以将其写成一个类,并将其导入到需要此功能的所有类中。
  2. 或者在每个需要它的.h.m文件中分别编写这些行。

3
界面并不必要,因为这个类别正在覆盖(实际上是重写)一个现有的方法。 - jscs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接