UITableViewCell 背景图片滚动后消失
Posted
技术标签:
【中文标题】UITableViewCell 背景图片滚动后消失【英文标题】:UITableViewCell background image disappears after scrolling 【发布时间】:2013-08-11 08:56:14 【问题描述】:我正在初始化 EventEditViewController
以使用以下代码添加新事件:
- (void)presentEventEditViewControllerWithEventStore:(EKEventStore*)eventStore
EKEventEditViewController* vc = [[EKEventEditViewController alloc] init];
vc.eventStore = eventStore;
vc.delegate = self; // Probably self
EKEvent* event = [EKEvent eventWithEventStore:eventStore];
event.title = @"";
event.startDate = [NSDate date];
event.endDate = [NSDate date];
event.URL = [NSURL URLWithString:@""];
event.notes = @"";
event.allDay = NO;
vc.event = event;
vc.editViewDelegate = self;
[self presentViewController:vc animated:NO completion:nil];
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
UITableView *tableView = ((UITableViewController *)viewController).tableView;
if ([viewController isKindOfClass:[UITableViewController class]])
//((UITableViewController *)viewController).tableView.backgroundColor = [UIColor clearColor];
for (NSInteger j = 0; j < [tableView numberOfSections]; ++j)
for (NSInteger i = 0; i < [tableView numberOfRowsInSection:j]; ++i)
UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]];
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background-1.png"]];
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor clearColor];
UITableView 应该出现,但是当我开始滚动直到 UITableViewCell
不再出现在 iPhone 的屏幕上然后向后滚动时,TableViewCell
忘记了它的图像并变成了标准的 UITableViewCell
(没有任何背景图像或自定义)。
滚动前的截图:http://postimg.org/image/vzlj3t5o9/)
滚动后的截图:(http://postimg.org/image/c30836v2v/)
我该如何解决这个问题?
提前谢谢你!
【问题讨论】:
【参考方案1】:出于几个原因,您不应该尝试在 tableView:cellForRowAtIndexPath:
实现的上下文之外管理表格单元格的外观。但是由于您无法将EKEventEditViewController
工作流程中涉及的各种视图控制器子类化,因此您将无法以通常的方式编写这些方法的实现。但是,您可以使用一些 Objective-C 的反射和运行时来插入您自己的 UITableViewDataSource
实现。
基本思想是用您控制的数据源切换表格视图的数据源,但仍然依赖于 Event Kit UI 框架提供的实现,并且只对它们返回的单元格应用视觉调整。下面是我FakeTableViewDataSource
的接口和实现:
@interface FakeTableViewDataSource : NSObject <UITableViewDataSource>
@property (nonatomic) id<UITableViewDataSource> realDataSource;
@end
@implementation FakeTableViewDataSource
- (BOOL)respondsToSelector:(SEL)aSelector
BOOL responds = [super respondsToSelector:aSelector];
if (!responds && self.realDataSource)
responds = [self.realDataSource respondsToSelector:aSelector];
return responds;
- (void)forwardInvocation:(NSInvocation *)anInvocation
if ([self.realDataSource respondsToSelector:[anInvocation selector]])
[anInvocation invokeWithTarget:self.realDataSource];
else
[super forwardInvocation:anInvocation];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [self.realDataSource tableView:tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.textColor = [UIColor greenColor];
return cell;
@end
您将实现 tableView:cellForRowAtIndexPath:
来实现您应用的特定视觉调整,我选择了文本标签颜色,因为它是否有效很明显。
现在,在您的 UINavigationControllerDelegate
方法中,不是迭代单元格,而是换出数据源。我的实现如图:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
if ([viewController isKindOfClass:[UITableViewController class]])
UITableView *tableView = ((UITableViewController *)viewController).tableView;
if (![tableView.dataSource isKindOfClass:[FakeTableViewDataSource class]])
FakeTableViewDataSource *fakeDataSource = [[FakeTableViewDataSource alloc] init];
fakeDataSource.realDataSource = tableView.dataSource;
tableView.dataSource = fakeDataSource;
[self.fakeDataSources addObject:fakeDataSource];
应该说,从可维护性的角度和应用商店批准的角度来看,以这种方式篡改框架是有潜在风险的。所以在使用这样的技术时要小心。
【讨论】:
@apptunes 不客气,这适用于背景图像和所有内容?以上是关于UITableViewCell 背景图片滚动后消失的主要内容,如果未能解决你的问题,请参考以下文章