1

我正在初始化 aEventEditViewController以使用以下代码添加新事件:

- (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 应该出现,但是当我开始滚动直到 aUITableViewCell不再出现在 iPhone 的屏幕上然后向后滚动时,TableViewCell它会忘记它的图像并变成标准UITableViewCell(没有任何背景图像或自定义)。

滚动前的截图:http: //postimg.org/image/vzlj3t5o9/

滚动后的截图:(http://postimg.org/image/c30836v2v/

我该如何解决这个问题?

先感谢您!

4

1 回答 1

0

tableView:cellForRowAtIndexPath:出于几个原因,您不应该尝试在 aa 实现的上下文之外管理表格单元格的外观。但是由于您无法对 's 工作流程中涉及的各种视图控制器进行子类化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];
        }
    }
}

应该说,从可维护性的角度和应用商店批准的角度来看,以这种方式篡改框架是有潜在风险的。所以在使用这样的技术时要小心。

于 2013-08-11T09:47:15.887 回答