UIImageView / TableFooterView上的两个init方法

时间:2013-02-11 07:42:46

标签: ios objective-c uitableview uiimageview

Gents,我正在尝试将一个图像设置为tableview的页脚。页脚图像需要根据导航栏中的按钮进行更改。 (设计是这样的,导航栏上有两个按钮,当加载屏幕/视图时,页脚中有一个图像,点击其中一个按钮更改它然后点击另一个按钮将其更改回来等等。)

我尝试使用UIImage和@property,然后尝试更改图像并在其上设置框架,但这不起作用(框架未正确设置)。基本上,我想做这样的事情:

[[self table1] setfooterview : [[uiimageview alloc] initwithframe:(CGRectMake (0,0,50,50)] and then I also need to add initwithimage:[UIImage imagenamed :@"hello-1.png"]] 

但问题是我不能在同一个语句中做两个init方法。而且我无法创建像UIImageView * hello之类的对象,或者因为我需要在以后的其他方法中使用它(在我处理不同按钮的按下的方法中)。 (稍后,我使用简单的if语句,然后根据按下的按钮在footerview上触发图像)。我的猜测是我可能需要做类似的事情     [[self table1] setfooterview:[[uiimageview alloc] initwithframe :( CGRectMake(0,0,50,50)]然后做一个设定的图像,但我认为因为setimage无效,我可能需要以某种方式投射它我怎么会这样做?

很抱歉语法错误,请忽略所有的语法错误,因为我的mac目前还没有和我在一起,我只是从内存中输入这个,而且我是iOS编程的新手。

3 个答案:

答案 0 :(得分:1)

您不需要发送两个init方法。图像和帧都是UIImageView的属性。 (frame属性继承自UIView。)您可以在发送init消息后设置它们。

你可以这样做:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(...)];
imageView.image = [UIImage imageNamed:@"hello-1"];
self.table1.footerView = imageView;

或者你可以这样做:

UIImageView *imageView = [[UIImageView alloc] initWithImage:
    [UIImage imageNamed:@"hello-1"];
imageView.frame = CGRectMake(...);
self.table1.footerView = imageView;

或者你甚至可以这样做:

UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(...);
imageView.image = [UIImage imageNamed:@"hello-1"];
self.table1.footerView = imageView;

答案 1 :(得分:0)

没有理由调用两个init方法。 您可以子类化或扩展UIImageView并实现一个允许一次设置框架和图像的新init方法。但你也可以做到以下几点。

UIImageView footerView =  [[uiimageview alloc] initwithframe:(CGRectMake (0,0,50,50)];
footerView.image =  [UIImage imagenamed :@"hello-1.png"];
[[self table1] setfooterview: footerView];

我刚刚键入的替代方案。这不是QAed,可能不是完美的解决方案,但应该给你一个正确方向的提示。 在.h文件中添加以下两行之一:

- (void) changeFooterImage:(UIImage *) image;
- (void) changeFooterImageNamed:(NSString *)imageName;

在.m文件中添加correspoinding实现:

- (void) changeFooterImage:(UIImage *) image {
    if (!self->footerView) {
        self->footerView = [[UIImageView alloc] initWithFrame:CGRectMake (0,0,50,50)];
        [[self tableView] setTableFooterView: footerView];
    }
    self->footerView.image =  image;
}

- (void) changeFooterImageNamed:(NSString *)imageName{
    if (!self->footerView) {
        self->footerView = [[UIImageView alloc] initWithFrame:CGRectMake (0,0,50,50)];
        [[self tableView] setTableFooterView: footerView];
    }
    self->footerView.image =  [UIImage imageNamed :imageName];
}

然后,您的第三方视图控制器应包含此视图控制器的.h文件。 更加“整洁”和“超出本书”将不会以这种方式直接绑定类。您应该更喜欢在协议中声明此方法然后实现协议,然后在实际调用该方法之前,您可以检查该类是否实现了协议。但我觉得这一切都有点太多新东西了。从这个开始,并在以后实现协议,原则上这是有效的。

答案 2 :(得分:0)

“我无法创建像UIImageView * hello这样的对象,或者其他什么,因为我需要在以后的其他方法中使用它”这是什么意思?

任何方式都可以初始化UIImageView并设置其框架和初始图像,然后再将其分配给footerView。