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
上使用两个IBOutlet
s 来填充作为UITableViewCell
一部分的UILabel
s 和UIImageView
s。您需要创建UITableViewCell
的自定义子类并将IBOutlet
s 添加到该子类中。
@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;
现在您的每个单元都有独立的IBOutlet
s。您还需要更改一些绑定。这是一个修复,但老实说,我会重写很多代码并在您的cellForRowAtIndexPath
调用中使用dequeueReusableCellWithIdentifier
,并保留一个您将重用的CustomCell
s 池,然后设置myLabel.text
和myImage.image
在cellForRowAtIndexPath
通话中。
【讨论】:
但是如果我使用可出列单元格计算行高不会复杂得多吗?我的想法是(因为我的行很少)如果我提前构建它们,我可以检查视图框架。我最终让它工作了,但是自定义视图单元比我所做的更加面向对象。 我不会说它是“无限多的面向对象”,无论哪种方式,面向对象都是您在编程时想要的,这就是这些东西的工作方式。如果你想用 IBOutlets 绑定东西,你不希望 IBOutlets 指向超过 1 个单个对象。计算行高并没有那么复杂,你仍然拥有每一行的所有数据,你可以像现在一样计算它(虽然我真的不知道你在哪里计算它) 请参阅我对您对 Apple 文档如何重用插座的评论的评论。显然不是“无限”=P。如果我在cellForRowAtIndexPath
中创建单元格视图来计算行高,那么我必须实际计算文本的高度,并自己添加边距和填充。如果创建了视图,我可以只使用 frame 属性。至少在我看来是这样的。
现在究竟是如何创建高度的?我并不关心 Cell 的 IBOutlet,但更关心标签和 imageview 的 IBOutlet。如果您查看文档,它使用可重复使用的单元格并使用 viewWithTag.
从每个单元格中提取标签和图像视图。这是一种简单的方法,如果您不喜欢它,则不需要您对 UITableViewCell
进行子类化。另外,您的 bindMyModel 不执行任何操作。您将单元格传递为view
,但您甚至没有使用它!
哦,是的,我实际上在我的代码中传递了单元格插座,当我重写发布时我把它搞砸了。哎呀。以上是关于UIImageView 背景颜色但不显示图像的主要内容,如果未能解决你的问题,请参考以下文章
将故事板 UIImageView 更改为具有背景颜色的自己的类
UIImageView backgroundColor colorWithPatternImage 不显示
如何在 Swift 中使用 UIImageView 设置背景图像