Редактировать: Хорошо, я вижу, в чем проблема. В iOS-разработке мы имеем дело с такими задачами с различными подклассами UITableCell. Как это:
+ (CGFloat)layoutHeightWithEntity:(id)entity {
CGFloat layoutHeight = 0;
// use data to calculate layout height dynamically if needed
// id data = [entity data];
// layoutHeight = layoutHeight + [data ...];
// or use a static layout height if the height of this kind of cells do not change
layoutHeight = 100;
return layoutHeight;
}
И в контроллере представления, вам необходимо подготовить исходные данные для представления таблицы, как это:
NSMutableArray *dataList = [NSMutableArray new];
NSMutableArray *firstSection = [NSMutableArray new];
[firstSection addObject:[XXXTableEntity entityWithReuseCellID:@"nameCell" data:someData cellClass:[XXXNameCell class]];
[dataList addObject:firstSection];
NSMutableArray *secondSection = [NSMutableArray new];
[firstSection addObject:[XXXTableEntity entityWithReuseCellID:@"pickerCell" data:someData cellClass:[XXXPickerCell class]];
[dataList addObject:secondSection];
[self setDataList:dataList];
ваш CustomTableEntity
может выглядеть следующим образом:
+ (instancetype)entityWithEntityID:(NSString *)entityID
cellReUseID:(NSString *)cellReUseID
cellClass:(Class<XXXBaseTableCellLayout>)cellClass
dataEntity:(id)dataEntity
precalculateHeight:(BOOL)precalculateHeight {
XXXBaseTableCellEntity *entity = [self new];
[entity setEntityID:entityID];
[entity setReuseCellID:cellReUseID];
[entity setDataEntity:dataEntity];
[entity setCellClass:cellClass];
if (precalculateHeight) {
[entity setLayoutHeight:[cellClass layoutHeightWithEntity:dataEntity]];
}
return entity;
}
- (CGFloat)layoutHeight {
if (_layoutHeight > 0) {
return _layoutHeight;
}
_layoutHeight = [[self cellClass] layoutHeightWithEntity:[self dataEntity]];
return _layoutHeight;
}
затем в ваших методах UITableViewDataSource:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.dataList.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.dataList[section] count];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [[[[self dataList] objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] layoutHeight];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
XXXTableEntity *entity = [[[self dataList] objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
XXXBaseTableCell *cell = [tableView dequeueReusableCellWithIdentifier:[entity reuseCellID] forIndexPath:indexPath];
[cell configureWithEntity:entity];
return cell;
}
приведенный выше код в основном основан на структуре, которую я пишу для своей компании, но вы должны получить эту идею. Структура имеет 3 класса, относящихся к виду таблицы: XXXBaseTableCell
, XXXBaseTableViewController
, XXXBaseTableCellEntity
. Все контроллеры представлений содержат подкласс подкласса таблицы XXXBaseTableViewController
, все подклассы ячеек ячеек XXXBaseTableCell
, все подклассы объектов подкласс XXXBaseTableCellEntity
.
Могу ли я спросить вас, почему вы хотите это сделать? Я думаю, что у вас проблемы с табличным представлением. Если вы можете объяснить, почему вы хотите это сделать, возможно, я могу помочь вам, чтобы вам не нужно было делать это вообще.
Вы не можете получить доступ к высоте прототипов ячеек в стандартном подходе. Но на самом деле вы можете получить доступ к любым данным в файле раскадровки, если вы действительно хотите это сделать. Ниже приведено как:
Storyboard - это XML-файл. Все, что вы делаете, когда редактируете файл раскадровки в IB, закодировано в XML-файле. Вы можете получить любую необходимую информацию, самостоятельно проанализируя XML-файл. Вы можете прочитать данные XML в файле раскадровки и передать его в парсер XML, чтобы получить данные DOM. Затем вы можете запросить DOM для получения данных. Вот вид XML тестовой раскадровки, которая содержит контроллер представления таблицы:
<!--Table View Controller-->
<scene sceneID="hbL-mT-mfb">
<objects>
<tableViewController id="XNl-aA-YKn" customClass="TableViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="lX1-Ry-xNl">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="100" id="4rn-ee-JoI">
<rect key="frame" x="0.0" y="28" width="375" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="4rn-ee-JoI" id="bdN-kI-rps">
<rect key="frame" x="0.0" y="0.0" width="375" height="99"/>
<autoresizingMask key="autoresizingMask"/>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="XNl-aA-YKn" id="GlZ-SO-7gG"/>
<outlet property="delegate" destination="XNl-aA-YKn" id="gqq-QI-tZD"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="RCX-w1-742" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="118" y="798"/>
</scene>
Пожалуйста, не делайте это так ...
Не беспокойтесь. Я не буду этого делать. То, что я делаю, использует табличное представление для управления отображением длинной серии различных панелей управления. Каждый из них представляет собой строку таблицы с различным набором элементов управления. Например, имя может быть простым UITextField, но будний день может быть UIPickerView. Таким образом, каждый из них отличается и может содержать значительно разные элементы управления. Я настроил его так, чтобы каждая строка имела связанный класс с обработчиками элементов управления для этого элемента. Я бы использовал свою «таблицу высот» перед использованием XML-парсера. –
@MAGNAWS Я отредактировал свой ответ. – jox0
Спасибо. Я ценю полный и хорошо написанный ответ. Я зажег его, хотя я не буду гарантировать, что буду использовать его, пока у меня не будет возможности изучить его и сравнить с моим вариантом использования. Сначала краснеть, кажется, немного сложнее, чем мой подход, но я могу понять, как его применять. Основная идея заключается в том, что я хочу упростить процесс описания этих различных панелей. В моем предыдущем приложении у меня были отдельные .xib-файлы, которые я создал вместе с набором высот. Это было слишком для меня. –