当视图不存在时,事先调用UITableView数据源方法

时间:2015-02-02 18:37:50

标签: ios objective-c multithreading uitableview datasource

我已经将我的代码丢弃到需要在呈现特定视图之前调用在某些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。

1 个答案:

答案 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中。