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 背景图片滚动后消失的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 阴影消失

UITableViewCell 框架仅在滚动后更新

UITableViewCell 的 UIButton 在滚动时消失

UITableViewCell 图像在滚动时消失

滚动时 UITableViewCell 的选定按钮消失

自定义 UITableViewCell 标签消失