2017-02-10 2 views
1

OK. Есть ряд вопросов, которые касаются этого, но ни один из них не касается того, что мне нужно.Доступ к строчной высоте в динамических UITableView Prototypes

Что мне нужно, просто, чтобы получить значение, которое я установил в IB для «пользовательской высоты строки» прототипа ячейки DYNAMIC (не статического).

Если таблица устанавливает статические прототипы, то это автоматически выполняется. Однако при использовании динамических прототипов это значение игнорируется в пользу основного значения rowHeight таблицы.

Я хочу, чтобы иметь возможность получить доступ к этому значению, поэтому я могу вернуть его в методе tableView(_:heightForRowAt:). Я могу сделать это вручную, имея внутреннюю таблицу высот и соответствующую прототипу, но это беспорядочно и неудобно, и требует, чтобы прототип всегда отображался в определенной строке.

Когда вызывается tableView(_:heightForRowAt:), я могу синтезировать идентификатор повторного использования, но мне бы хотелось, чтобы вы не загружали камеру просмотра до нужного времени (tableView(_:cellForRowAt:)).

Есть ли хороший способ получить к нему доступ? Я не вижу никакой литературы в документах Apple о доступе к прототипам.

ответ

2

Редактировать: Хорошо, я вижу, в чем проблема. В 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> 

Пожалуйста, не делайте это так ...

+0

Не беспокойтесь. Я не буду этого делать. То, что я делаю, использует табличное представление для управления отображением длинной серии различных панелей управления. Каждый из них представляет собой строку таблицы с различным набором элементов управления. Например, имя может быть простым UITextField, но будний день может быть UIPickerView. Таким образом, каждый из них отличается и может содержать значительно разные элементы управления. Я настроил его так, чтобы каждая строка имела связанный класс с обработчиками элементов управления для этого элемента. Я бы использовал свою «таблицу высот» перед использованием XML-парсера. –

+1

@MAGNAWS Я отредактировал свой ответ. – jox0

+0

Спасибо. Я ценю полный и хорошо написанный ответ. Я зажег его, хотя я не буду гарантировать, что буду использовать его, пока у меня не будет возможности изучить его и сравнить с моим вариантом использования. Сначала краснеть, кажется, немного сложнее, чем мой подход, но я могу понять, как его применять. Основная идея заключается в том, что я хочу упростить процесс описания этих различных панелей. В моем предыдущем приложении у меня были отдельные .xib-файлы, которые я создал вместе с набором высот. Это было слишком для меня. –

Смежные вопросы