我已经将UIImageView子类化了,它被称为ACCascadeImageView。
@interface ACCascadeImageView : UIImageView{
BOOL isSpotlight;
}
@property (assign, nonatomic) BOOL isSpotlight;
-----
@implementation ACCascadeImageView
@synthesize isSpotlight;
然后我创建这样的实例,并添加一个手势识别器..
ACCascadeImageView *imageview =
[[ACCascadeImageView alloc] initWithFrame:imageframe];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[imageview addGestureRecognizer:singleTap];
在handleSingleTap方法中,我遍历我的UIScollView子视图,我尝试为每个子视图执行此操作...
(imageview in this scope is [gestureRecognizer view])
[imageview setIsSpotlight:NO];
但我明白了......
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[UIImageView setIsSpotlight:]: unrecognized selector sent to instance 0x6888be0'
为什么我的ACCascadeImageView
突然变成UIImageView
?如果我做了一些愚蠢的事情,我很抱歉,但是我已经将UIImageView
分组了。我很困惑。
我应该说我NSLog'd [imageview class]
而且我得到了“ACCascadeImageView
”。
问题在于:
NSArray *cascadeImages = [PhotoCascade subviews];
for (ACCascadeImageView *v in cascadeImages){
NSLog(@"RESPONDS: %d", [v respondsToSelector:@selector(setIsSpotlight:)]);
[v setIsSpotlight:NO];
}
我得到: 回应:1 回复:0
然后它就死了。
答案 0 :(得分:0)
您无法确定[gestureRecognizer view]
是您的UIImageView
。要检查此操作,请尝试NSLog(@"view: %@", [gestureRecognizer.view class]);
。我的测试表明它只是UIView
。
如果要在图像视图中添加手势识别器,则只有在用户点击此视图时才会触发选择器。所以你可以省略那些检查。
答案 1 :(得分:0)
您说handleSingleTap
在回复respondsToSelector:@selector(setIsSpotlight:)
时返回TRUE,但是当您尝试使用setIsSpotlight
时,它会失败?这是一个谜。
例如,我创建了这个超级简单的示例,它可以按照您的预期运行:
#import "ViewController.h"
@interface Test : UIImageView
@property (assign, nonatomic) BOOL isSpotlight;
@end
@implementation Test
@synthesize isSpotlight;
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
Test *test = [[Test alloc] initWithFrame:self.view.frame];
[self.view addSubview:test];
test.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[test addGestureRecognizer:tap];
}
- (void)handleSingleTap:(UIGestureRecognizer *)sender
{
Test *imageview = (Test *)[sender view];
NSLog(@"%s %d", __FUNCTION__, [imageview respondsToSelector:@selector(setIsSpotlight:)]);
[imageview setIsSpotlight:NO];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
问题必须简单,但问题中提供的代码片段有限,问题是什么并不明显。但是您上面提供的代码不会表现出您描述的那种问题。您的应用中必定存在一些流氓UIImageView
!
答案 2 :(得分:0)
根据您的结果,由于您每个对象只测试一次,因此数组中的第一个对象似乎是您的自定义子视图,但第二个不是。也许某种程度上 cascadeImages 中的一个对象不是ACCascadeImageView。逐步执行数组并对每个数组执行内省,记录结果,以确保该数组仅包含ACCascadeImageViews。