首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试属性的存在性(即numberOfValidItemsForDrop)

测试属性的存在性(即numberOfValidItemsForDrop)
EN

Stack Overflow用户
提问于 2014-01-15 11:35:32
回答 2查看 109关注 0票数 0

我的主要问题是,是否以及如何能够测试一个任意对象是否支持给定的属性。对于方法,这很简单。我会向对象发送一个respondsToSelector:消息并检查结果。我在物业方面找不到类似的机制。

我手头的具体问题是,我正在编写一个自定义NSView,它支持将图像文件(复数)放到上面。我是建立在10.9和部署10.6。对于运行10.7及更高版本的机器,我希望利用enumerateDraggingItemsWithOptions:...方法和numberOfValidItemsForDrop属性在拖动图像(数字和可接受文件)中提供的用户反馈。

我最初的想法如下。测试提供给draggingEntered:方法的发送方(声明的id < NSDraggingInfo >)。如果是,请使用10.7中提供的机制。如果不是,请回到以前的机制。

代码语言:javascript
复制
if( [sender respondsToSelector:@selector(enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:) ] )
{
  __block NSInteger n=0;
  [sender enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationClearNonenumeratedImages
                                    forView:self
                                    classes:types
                              searchOptions:options
                                 usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) { ++n; } ];
   self.numberOfValidItemsForDrop = n;
   rval = (n>0 ? NSDragOperationCopy : NSDragOperationNone);
} 
else
{
  NSArray *itemsInDrag = [[sender draggingPasteboard] readObjectsForClasses:types options:options];
  rval = [itemsInDrag count]>0 ? NSDragOperationCopy : NSDragOperationNone); 
}

,我关心的是,分配给numberOfValidItemsForDrop是否会在10.6环境中造成问题。在中,我做了一个快速测试,在这个测试中,我在一个if(0)条件下分配给一个伪属性,编译器阻塞了。

代码语言:javascript
复制
if(0)
{
   sender.bogus=1;
}

这与该属性在开发环境中无效并不是一回事。但是,我担心的是,在运行时10.6上,分配给numberOfValidItemsForDrop可能也有问题,即使它永远不应该实际执行。

我已经建立了一个小的虚拟应用程序,我已经发送给我的测试人员,但还没有收到回音,并希望继续推进这个项目。

谢谢您提供的任何/全部信息。

EN

回答 2

Stack Overflow用户

发布于 2014-01-15 11:41:50

您可以使用Objective运行时函数class_getProperty来测试是否存在命名的属性:

代码语言:javascript
复制
if(class_getProperty([self class], "numberOfValidItemsForDrop")) {
  // property exists
}

请参阅https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

票数 2
EN

Stack Overflow用户

发布于 2014-01-15 11:48:29

若要检查某个属性是否存在,可以将其用作:假定该属性不为readonly

代码语言:javascript
复制
if ([yourClassObject respondsToSelector:@selector(set<yourPropertyName>:)]) {
    NSLog(@"yes it exists");
}
else{
    NSLog(@"no it doesn't exists");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21136355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档