2012-01-23 3 views
7

Ahoy!Создание многоразового UIView, подобного UITableViewCell

Я пытаюсь создать многоразовый UIView (по разным причинам), подобный реализации UITableViewCell, используемой в UITableViewController. Я хотел бы использовать многоразовое представление в UIScrollView, поэтому я знаю, что не пытаюсь достичь чего-то совершенно недостижимого.

Реализация по умолчанию это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    // 

    //return cell 
    return cell; 
} 

Исходя из этого, стоит отметить, что ячейка из очереди из UITableView. Если ячейка недействительна, создается новая ячейка. Мой вопрос в том, как эта ячейка затем снова «ставится в очередь» для повторного использования?

Моя текущая попытка реализации выглядит следующим образом:

- (TestScrollViewCell *)scrollView:(TestScrollView *)_scrollView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    TestScrollViewCell *cell = (TestScrollViewCell *)[scrollView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[TestScrollViewCell alloc] initWithFrame:CGRectZero]; 
    } 

    // 

    //return cell 
    return cell; 
} 

Я имею в виду, что добавление NSMutableDictionary к моему TestScrollView хранить cellIdentifier и TestScrollViewCell (UIView), а затем выщипывание их обратно на основе словаря ключ был бы хорошим началом, но действительно ли это настоящая реализация «многоразовых» ячеек?

Проблема, которую я вижу, заключается в том, что я бы добавил UIView в ScrollView, который позиционируется на основе фрейма. Удаление представления в этом смысле не позволило бы мне добавить представление в вид прокрутки, не затрагивая первое представление (путем изменения фрейма), но верно ли это, как работают UITableViewCells, а также заголовки/нижние колонтитулы раздела?

Я искал this implementation, который, кажется, следит за тем же маршрутом, который я собирался реализовать, но я не продаюсь на 100%, это настоящая реализация многоразовых ячеек.

Неужели кому-то повезло с этим ранее? Я пытаюсь взять лидерство Apple на этом, но кроме UITableViewCell и MKAnnotationView (MapKit), для меня нет доступных реализаций для этого.

Любая помощь была бы принята с благодарностью.

ответ

3

Это не просто взгляд, это весь UITableViewController, который вам нужно будет воссоздать. Поток повторного использования выглядит следующим образом: dequeueReusableCell получает пустую повторно использованную ячейку из некоторого хранилища, я думаю, из NSMutableArray (захватить первый объект из массива, а затем удалить его из массива и вернуть его). Если массив пуст, метод возвращает nil. Вы проверяете значение ячейки, если это нуль, вы создаете новый экземпляр класса ячейки. Если это не нуль, вы заполняете его своими данными. Это касается каждой видимой ячейки, то есть каждой ячейки, которая может поместиться на экране. Любые невидимые ячейки не инициализируются. Когда пользователь прокручивает таблицу, ячейка, которая полностью отключена (не отображается один пиксель), отправляется повторно для повторного использованияQueue - все их подпункты и значения возвращаются к значениям по умолчанию или просто заполняются, а затем ячейка добавляется в конец нашего NSMutableArray, это очередь. Надеюсь, я объяснил достаточно хорошо. EDIT: О, и еще одно - вам понадобятся разные очереди повторного использования для каждого идентификатора повторного использования.