我的UIImageView没有获得我的子类UIImageView的所有方法

时间:2010-01-26 22:14:46

标签: iphone objective-c xcode

我使用这个方法创建了UIImageView的子类(称为MyPicture):

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.userInteractionEnabled = YES;
    }
    return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"-- I AM TOUCHED --");
}

// ...

当我使用InterfaceBuilder创建一个带有MyPicture类的UIImageView时,一切正常,控制台写道:“我被触摸了”。但仅限于,当我在IB中激活用户交互时。

但是当我以程序方式创建UIImageView时,它会起作用。 在ViewController.h中:

MyButton * foo;

在ViewController.m中:

- (void)viewDidLoad {
    flo = [[UIImageView alloc]initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
    foo.userInteractionEnabled = YES;
    foo.image = [UIImage imageNamed:@"Picture 1.png"];
    [self.view addSubview:foo];
    [super viewDidLoad];
}

我可以看到图片,所以它必须是我的UIImageView子类。但为什么他没有发现这些接触?

2 个答案:

答案 0 :(得分:4)

我不明白为什么它必须是你的子类。看到图片只是意味着它是一个UIImageView。这正是它的原因(不是子类)这里:

foo = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];

您正在初始化UIImageView,而不是您的子类。尝试将该行更改为:

foo = [[MyPicture alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];

编辑:此外,由于您在子类'initWithFrame:'方法中设置了userInteractionEnabled = YES,因此没有理由在此行中再次执行此操作:

foo.userInteractionEnabled = YES;

答案 1 :(得分:1)

当你继承UIImageView时,应用程序可以通过几种不同的方式调用对象。在Interface Builder中创建的UIImageViews是预编译的,并且无需调用-(id)init方法即可加载到内存中。相反,它们在将nib的内容加载到内存后调用- (void)awakeFromNib

确保将您的类标识设置为您的子类,并在子类的awakeFromNib方法中设置userInteractionEnabled。这将允许您设置用户交互而无需绑定。

要以编程方式完全加载UIImageView,请确保从正确的类中进行分配。您的代码是从UIImageView超类调用的。

- (void)viewDidLoad {
    foo = [[MyImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
    foo.image = [UIImage imageNamed:@"Picture 1.png"];
    [self.view addSubview:foo];
    [super viewDidLoad];
}

这将从您的子类而不是超类调用- (id)initWithFrame并执行您的自定义代码。这也会将- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event调用发送到您的子类而不是超类。