无法设置UIImageView子类的属性

时间:2012-09-03 02:22:57

标签: objective-c ios xcode4

我已经将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

然后它就死了。

3 个答案:

答案 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。