UIImageView 背景颜色但不显示图像

Posted

技术标签:

【中文标题】UIImageView 背景颜色但不显示图像【英文标题】:UIImageView background color but not image displaying 【发布时间】:2012-06-29 16:10:00 【问题描述】:

我有一个UITableViewCell nib 文件,其中有一个UIImageView 和一个UILabel。我有这两个到我的控制器的插座以及电池本身的插座。我正在以编程方式设置标签和图像,但图像未显示。

于是我去测试了一下,即使我在nib文件中设置了图片本身,也没有显示出来。如果我设置背景颜色,它显示得很好。有任何想法吗?我被卡住了。

在我看来,它似乎与代码无关,因为它甚至不能通过 nib 文件工作。但无论如何它都在这里,以防它以某种方式有所帮助。

MyViewController.h

@interface MyViewController : UITableViewController

@property (strong, nonatomic) MyModel *myModel;
@property (strong, nonatomic) NSArray *tableViewCells;

@property (strong, nonatomic) IBOutlet UITableViewCell *tableViewCell;
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@property (weak, nonatomic) IBOutlet UIImageView *myImage;

@end

MyViewController.m

@interface MyViewController ()

- (void)bindMyModel:(MyModel*)model toView:(UITableViewCell*)view;

- (UITableViewCell*)copyUITableViewCell:(UITableViewCell*)cell;

@end

@implementation MenuViewController

@synthesize myModel = _myModel;
@synthesize tableViewCells = _tableViewCells;

@synthesize tableViewCell = _tableViewCell;
@synthesize myLabel = _myLabel;
@synthesize myImage = _myImage;

- (void)viewDidLoad

    [super viewDidLoad];
    NSMutableArray *cells = [[NSMutableArray alloc] init];
    [MyModel loadAndOnSuccess:^(id data, id context) 
        self.myModel = data;
        for (MyModel *item in self.myModel.items) 
            [[NSBundle mainBundle] loadNibNamed:@"TableCellNib" owner:self options:nil];
            [self bindMyModel:item toView:self.tableViewCell];
            [cells addObject:[self copyUITableViewCell:self.tableViewCell]];
            self.tableViewCell = nil;
        
        self.tableViewCells = [[NSArray alloc] initWithArray:cells];
     onFail:^(NSString *error, id context) 
        NSLog(@"FAIL with error: %@", error);
    ];


- (void)viewDidUnload

    [self setTableViewCell:nil];
    [self setMyLabel:nil];
    [self setMyImage:nil];
    [super viewDidUnload];


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return YES;


- (void) bindMyModel:(MyModel*)model toView:(UITableViewCell*)view

    if (view) 
        self.myLabel.text = model.myLabelText;
        self.myImage.image = model.myImageResource;
        self.myLabel = nil;
        self.myImage = nil;
    


- (UITableViewCell*)copyUITableViewCell:(UITableViewCell*)cell

    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: cell];
    return [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];


#pragma mark - Table view data source

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    return [self.tableViewCells objectAtIndex:indexPath.row];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return self.myModel.items.count;


#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    // Irrelevant code here


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    return ((UITableViewCell*)[self.tableViewCells objectAtIndex:indexPath.row]).frame.size.height;


@end

【问题讨论】:

标签是否显示文字? 你也把这些插座正确连接到xib文件了。 标签显示正常。并且插座连接正确。就像我说的,即使我在 nib 文件本身中设置了 UIImageView 图像,它也不会显示出来。但是背景颜色会,如果我设置的话! 您是否在项目中添加了 test_image.png 文件,这个文件是否在项目文件夹中? 是的,它就在那里。如果我转到 Interface Builder 中的 UIImageView,转到 Attributes Inspector,然后单击 Image 旁边的下拉菜单,它就会显示出来。它还显示在我的 nib 文件的预览中。它只是在我运行时不显示。 【参考方案1】:

您正尝试在您的UITableViewController 上使用两个IBOutlets 来填充作为UITableViewCell 一部分的UILabels 和UIImageViews。您需要创建UITableViewCell 的自定义子类并将IBOutlets 添加到该子类中。

@interface CustomCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@property (weak, nonatomic) IBOutlet UIImageView *myImage;

@end

然后在你的bindMyModel:toView:

- (void) bindMyModel:(MyModel*)model toView:(CustomCell*)view

    if (view) 
        view.myLabel.text = model.myLabelText;
        view.myImage.image = model.myImageResource;
    

现在您的每个单元都有独立的IBOutlets。您还需要更改一些绑定。这是一个修复,但老实说,我会重写很多代码并在您的cellForRowAtIndexPath 调用中使用dequeueReusableCellWithIdentifier,并保留一个您将重用的CustomCells 池,然后设置myLabel.textmyImage.imagecellForRowAtIndexPath 通话中。

【讨论】:

但是如果我使用可出列单元格计算行高不会复杂得多吗?我的想法是(因为我的行很少)如果我提前构建它们,我可以检查视图框架。我最终让它工作了,但是自定义视图单元比我所做的更加面向对象。 我不会说它是“无限多的面向对象”,无论哪种方式,面向对象都是您在编程时想要的,这就是这些东西的工作方式。如果你想用 IBOutlets 绑定东西,你不希望 IBOutlets 指向超过 1 个单个对象。计算行高并没有那么复杂,你仍然拥有每一行的所有数据,你可以像现在一样计算它(虽然我真的不知道你在哪里计算它) 请参阅我对您对 Apple 文档如何重用插座的评论的评论。显然不是“无限”=P。如果我在cellForRowAtIndexPath 中创建单元格视图来计算行高,那么我必须实际计算文本的高度,并自己添加边距和填充。如果创建了视图,我可以只使用 frame 属性。至少在我看来是这样的。 现在究竟是如何创建高度的?我并不关心 Cell 的 IBOutlet,但更关心标签和 imageview 的 IBOutlet。如果您查看文档,它使用可重复使用的单元格并使用 viewWithTag. 从每个单元格中提取标签和图像视图。这是一种简单的方法,如果您不喜欢它,则不需要您对 UITableViewCell 进行子类化。另外,您的 bindMyModel 不执行任何操作。您将单元格传递为view,但您甚至没有使用它! 哦,是的,我实际上在我的代码中传递了单元格插座,当我重写发布时我把它搞砸了。哎呀。

以上是关于UIImageView 背景颜色但不显示图像的主要内容,如果未能解决你的问题,请参考以下文章

将故事板 UIImageView 更改为具有背景颜色的自己的类

UIImageView backgroundColor colorWithPatternImage 不显示

如何在 Swift 中使用 UIImageView 设置背景图像

iOS:如果背景图像与按钮颜色相同,则更改我的 UIButton 的颜色

如何根据背景颜色自动更改视图的透明颜色

平铺背景图片:我可以使用UIImageView轻松完成吗?