Man*_*nni 2 objective-c categories
在Java中,您可以使用instanceof检查类是否扩展另一个类或实现接口.
在Objective-C中,您可以使用isKindOfClass检查类是否扩展了另一个类:
if ([myObject isKindOfClass:[AnClass class]]) { }
Run Code Online (Sandbox Code Playgroud)
但我怎么能检查,如果一个类被通过扩展类别?
不幸的是,我的第一个编辑的代码有点令人困惑和荒谬,抱歉!现在,这是我的新代码:
我将解释整个问题:
我有一个课程ViewCustomerCreate延伸UITableViewController.ViewCustomerCreate按类别扩展ICheckBox.这是我的代码不起作用:
- (void)closeModalView {
UINavigationController *parent = (UINavigationController *)self.navigationController.parentViewController;
UIViewController *parentViewContr = parent.topViewController;
if ([parentViewContr isKindOfClass:[id<ICheckBox> class]]) { // ERROR-MESSAGE see below
id<ICheckBox> parent2 = (id<ICheckBox>)parentViewContr; // works fine :-)
[parent2 setSelectedElementId:checkedIndex]; // works fine :-)
}
[self.navigationController dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
错误消息是: " 错误:'id'不是Objective-C类名或别名 "
我认为我不能使用isKindOfClass来检查一个类是否被一个类扩展,不是吗?
PS:我想要什么?我有一个带复选框的通用模态视图,如果我关闭此视图,则应该通知父视图用户选择的内容.
天哪,我把分类与协议混为一谈!! Aaaaahhhhh ^^
解决方案:
if ([parentViewContr conformsToProtocol:@protocol(ICheckBox)]) {
Run Code Online (Sandbox Code Playgroud)
无法检查类是否按类别扩展,但您可以检查实例是否响应特定选择器:
- (BOOL)respondsToSelector:(SEL)sel;
Run Code Online (Sandbox Code Playgroud)
在Objective-C中,您应该更少关注对象是什么,并且更担心对象可以做什么.
如果它像鸭子一样走路,听起来像鸭子,看起来像鸭子,它可能会飞,你知道我的意思吗?
你应该这样使用:
if ([myObject respondsToSelector:@selector(myMethod:)])
{
// do whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)
快速说明一下,因为您提到了Java接口.您可以使用以下命令检查对象是否实现了协议(类似于Java接口,但不完全相同):
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2138 次 |
| 最近记录: |