【问题标题】:Two init methods on UIImageView/TableFooterViewUIImageView/TableFooterView 上的两个初始化方法
【发布时间】:2013-01-26 07:12:00
【问题描述】:

先生们,我正在尝试将图像设置为 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"]] 

但问题是我不能在同一个语句中执行两个初始化方法。而且我无法创建像 UIImageView *hello 之类的对象,因为稍后我需要在不同的方法中使用它(在我处理不同按钮按下的方法中)。 (稍后,我使用一个简单的 if 语句,然后根据按下的按钮触发页脚视图上的图像)。我的猜测是我可能不得不做类似
[[self table1] setfooterview: [[uiimageview alloc] initwithframe :(CGRectMake (0,0,50,50)] 然后做一个设置图像,但我认为由于 setimage 无效,我可能需要以某种方式投射它. 我该怎么做?

对不起,糟糕的语法,请忽略所有语法错误,因为我的 mac 目前不在我身边,我只是从内存中输入这个,而且我是 iOS 编程的新手。

【问题讨论】:

    标签: ios objective-c uitableview uiimageview


    【解决方案1】:

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

    你可以这样做:

    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;
    

    【讨论】:

    • 但是看重点是,我需要能够在我的 viewdidload 和稍后的另一种方法中使用这个页脚视图(我的两个按钮的点击处理程序),所以创建一个 *imageview 就可以了仅适用于该类,我将无法在我的其他点击处理方法中处理...
    • 您可以以self.table1.footerView 再次访问它,或者您可以在实例变量中存储对它的引用。
    • 如果您想使用self.table1.footerView 访问它,请将其转换回UIImageView,如下所示:[(UIImageView *)self.table1.footerView setImage:newImage]
    • 我将在哪里/如何处理这种情况?你能用以下方式给我一个例子吗:说,这是我的 viewdidLoad 方法:嗯,所以你说这会起作用: - (void)viewDidLoad { UIImageView *imageView = [[UIImageView alloc] init]; imageView.frame = CGRectMake(...); imageView.image = [UIImage imageNamed:@"hello-1"]; self.table1.footerView = imageView;然后我有我的 - (IBAction)rButtonPressed:(UIButton *)sender { } 我如何以这样的方式处理它,即使在 rButtonPressed 方法中我也可以处理页脚视图上的图像并根据需要换掉它? As In,我该如何施放它以及在哪里施放?
    • 你自己尝试一些东西会更好。如果您无法使其正常工作,请编辑您的问题以包含您尝试过的内容。
    【解决方案2】:

    没有理由调用两个初始化方法。 您可以继承或扩展 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 文件中添加相应的实现:

    - (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];
    }
    

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

    【讨论】:

    • 再一次,这个问题是我无法在我定义它的方法之外使用它。我在 viewdidLoad 中需要它一次,然后在我的点击处理方法中需要它。
    • 请进一步解释一下。你有什么问题?您是否需要在一行中使用此解决方案? (在这种情况下,您可以实现自己的 init 方法)或者您不能使用 iVar 或属性来保留引用吗? (我的解决方案没有 iVar 和属性,因为您自己没有使用过)。对不起,如果所有这些问题都是错误的。我真的(还)不明白你的问题。
    • 我尝试使用一个属性,但它不起作用。你能告诉我如何使用 Ivar 吗?是的,保持引用很重要,因为我想在 hviewdidload 中设置我的页脚视图,然后在 ibaction 方法中对同一个页脚视图执行一些操作。 C
    【解决方案3】:

    “我无法创建像 UIImageView *hello 之类的对象,因为我以后需要在不同的方法中使用它”这是什么意思?

    您可以通过任何方式初始化 UIImageView 并在将其分配给 footerView 之前设置其框架和初始图像。

    【讨论】:

    • 但是在我将它分配给footerView之后,我不能用其他方法访问它吧?
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2011-02-02
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多