我正在初始化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
会忘记它的图像并变成标准{{ 1}}(没有任何背景图片或自定义)。
滚动前的屏幕截图:http://postimg.org/image/vzlj3t5o9/)
滚动后的屏幕截图:( http://postimg.org/image/c30836v2v/)
如何解决此问题?
提前谢谢!
答案 0 :(得分:0)
由于某些原因,您不应该尝试在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];
}
}
}
应该说,从可维护性的角度和应用程序商店批准的角度来看,以这种方式篡改框架具有潜在的风险。所以在使用这样的技术时要小心。