我已经将我的代码丢弃到需要在呈现特定视图之前调用在某些UIViewController类中编写的UITableView数据源方法的情况下,以便单元格被预先填充并且我可以设置一个BOOL,即不存在的数据viewController类是否有效。如果需要,我可以更详细地解释它,但我想知道是否可以这样做。如果是,那该怎么办? ..作为我在[tableView reloadData]之后编写的特定代码集依赖于运行UITableView的dataSource方法。如果需要在特定的线程中处理,请注意这一点?
以下是我调用reloadData的情况。注意:当尚未调用basicFactsViewController的viewWillAppear方法时,这种情况发生在另一个类中:
- (BOOL) isComplete {
dispatch_async(dispatch_get_main_queue(), ^{
[basicFactsViewController.tableView reloadData];
});
return basicFactsViewController.isComplete && selectedVehicleId && selectedMakeId && selectedModelId && selectedYearId && selectedTrimId;
}
现在在此方法中检查basicFactsViewController.isComplete:
- (BOOL) isComplete {
[self collectKeyHighlights];
return _isComplete;
}
现在字典" tableCells"在下面的方法中使用细胞群来检查是否所有特征都已完成:
- (NSDictionary *) collectKeyHighlights {
NSMutableDictionary *key_highlights_update = [NSMutableDictionary new];
NSMutableDictionary *cell_highlight_update = [NSMutableDictionary new];
if(visible_key_highlights.count == 0) _isComplete = YES;
_isComplete = YES;
__block NSMutableArray *reloadCellAtIndexPathSet = [[NSMutableArray alloc] init];
[visible_key_highlights enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSDictionary *feature = (NSDictionary *)obj;
UITableViewCell *cell = [self.tableCells objectForKey:[NSIndexPath indexPathForRow:idx inSection:0]];
if(cell) {
if([cell isKindOfClass:[DRColorSelectionTableViewCell class]]) {
NSInteger selectedIndex = ((DRColorSelectionTableViewCell *)cell).selectedIndex;
NSInteger numberOfSegments = ((DRColorSelectionTableViewCell *)cell).numberOfSegments;
if(selectedIndex > -1 ) {
NSArray *dataValues = [[visible_key_highlights objectAtIndex:idx] objectForKey:@"data_values"];
NSDictionary *colorData;
BOOL reloadCellForIndexPath = NO;
if (numberOfSegments == selectedIndex) {
colorData = @{ @"normalized" : @"user_defined", @"isother" : @YES, @"hexcode":@"#FFFFFF", @"actual":((DRColorSelectionTableViewCell *)cell).otherColorTextField.text};
reloadCellForIndexPath = YES;
}
else{
colorData = [dataValues objectAtIndex:selectedIndex];
}
[key_highlights_update setObject:colorData forKey:[feature objectForKey:@"name"]];
[cell_highlight_update setObject:colorData forKey:[feature objectForKey:@"name"]];
if (![colorData isEqual:[prevSelections objectForKey:[feature objectForKey:@"name"]]]) {
[reloadCellAtIndexPathSet addObject:((DRColorSelectionTableViewCell *)cell).indexPath];
}
//if (reloadCellForIndexPath) {
//}
} else {
_isComplete = NO;
}
} else if([cell isKindOfClass:[DRInputTableViewCell class]]) {
NSString *textInput = ((DRInputTableViewCell *)cell).inputTextField.text;
if([textInput length]) {
[key_highlights_update setObject:[NSString toSnakeCase:textInput] forKey:[feature objectForKey:@"name"]];
[cell_highlight_update setObject:textInput forKey:[feature objectForKey:@"name"]];
}else {
_isComplete = NO;
}
} else if([cell isKindOfClass:[DRPickerTableViewCell class]]) {
NSString *textInput = ((DRPickerTableViewCell *)cell).inputField.text;
if([textInput length]) {
[key_highlights_update setObject:[NSString toSnakeCase:textInput] forKey:[feature objectForKey:@"name"]];
[cell_highlight_update setObject:textInput forKey:[feature objectForKey:@"name"]];
} else {
_isComplete = NO;
}
} else if([cell isKindOfClass:[DRSwitchTableViewCell class]]) {
// send this everytime for now
BOOL isSelected = ((DRSwitchTableViewCell *)cell).toggleButton.selected;
[key_highlights_update setObject:[NSNumber numberWithBool:isSelected] forKey:[feature objectForKey:@"name"]];
[cell_highlight_update setObject:[NSNumber numberWithBool:isSelected] forKey:[feature objectForKey:@"name"]];
}
}
else{
_isComplete = NO;
}
}];
prevSelections = cell_highlight_update;
if ([reloadCellAtIndexPathSet count]) {
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:reloadCellAtIndexPathSet withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
return key_highlights_update;
}
现在来了 [tableView reloadData]
没有调用 cellForRowAtIndePath :因此, tableCells 没有填充,因此,我总是得到_isComplete = NO。
答案 0 :(得分:0)
如果我理解正确,那么当tableview加载(调用它的dataSource方法)并且你想尽早触发它来使用它的结果时就会进行处理。如果basicFactsViewController尚未显示,则提前调用[basicFactsViewController.tableView reloadData];
将无法正常工作。如果basicFactsViewController是一个UIViewController并且具有默认视图并且tableView属性是该标准视图的子视图,那么(如果我没记错的话)tableView属性将为nil,直到显示basicFactsViewController。围绕它的一个快捷方式是访问viewController的view属性并使其初始化(viewDidLoad及其所有)。您可以通过简单地发送viewController消息来实现:[basicFactsViewController view]
。
如果到目前为止我是对的,我相当自信会初始化tableView属性。但我不确定它是否会导致表视图加载其数据。即使它确实有效,但它绝对不是您尝试构建的代码片段的最佳解决方案。 Apple的UIKit设计一直专注于模型/视图/控制器模式,并且更容易使用流程并执行相同的操作。我想你可以将tableView的数据源方法中的处理移动到另一个类(或者甚至是同一个类),并调用该方法为tableView和你拥有的任何其他检查做好一切准备,将数据存储在字典和数组中,以便在调用cellForIndex时可以通过索引将它们轻松地加载到tableView中。