Форум программистов, компьютерный форум, киберфорум
Swift
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
1

Написать собственную таблицу (упрощенный аналог UITableView) использую UIScrollView

12.10.2020, 23:03. Показов 2591. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Большая таблица

Предпосылки
UIKit содержит таблицу UITableView. Это очень удобный компонент для построения интерфейсов. К сожалению, он не справляется с большим количеством ячеек.

Исходные данные
Приложение содержит два экрана. Первый создан для отладки. На нём посередине экрана помещена таблица с рамкой. В таблице должны быть показаны 50 ячеек. На втором экране таблица занимает всё пространство. В таблице должен быть показан триллион ячеек.

Задание
Основное: В проекте есть класс TableView. Необходимо добавить имплементацию, не меняя публичного интерфейса. Таблица должна показывать ячейки класса TableCell. Высота каждой ячейки - 40, ширина совпадает с шириной таблицы.

Дополнительные: Поддержать переиспользование ранее созданных ячеек. Поддержать поворот телефона, при котором первая видимая ячейка будет сохранять своё положение, относительно верхней границы таблицы.

Подсказки
1)Свойство таблицы dataSource будет ненулевым сразу после инициализации таблицы. К нему можно обращаться для того, чтобы узнать какое количесство строк должна отображать таблица, а также какой текст должен быть у каждой ячейки TableCell.

2)Размер таблицы на экране и размер контента, который она отображает это разные вещи. Для модификации размера контента можно использовать свойство contentSize.

3)Каждый объект класса UIView (и подклассы, например наша таблица TableView) удовлетворяют протоколу UICoordinateSpace. В нём содержатся методы для преобразования между разными системам координат.

4)Начните с того, что задайте произвольный большой contentSize своей таблице (например в инициализаторе) и посмотрите на значения bounds и frame в методе layoutSubviews() таблицы при скролле. Обратите внимание когда и как часто вызывается метод layoutSubviews().


Подскажите пожалуйста как это сделать. Не очень понятно как переписать механизм переиспользования уже созданных клеток таблицы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2020, 23:03
Ответы с готовыми решениями:

Написать упрощенный аналог утилиты tail
Не придумаю, как это реализовать. Help, кто хоть немного шарит =) Написать упрощенный аналог...

Упрощенный аналог утилиты paste
Вам необходимо реализовать упрощенный аналог утилиты paste. Эта утилита должна принимать на вход...

Упрощенный аналог ngrok - Трех или четырехзвенная архитектура?
тааак... короче, есть задумка создать упрощенный аналог ngrok. Для своих нужд) есть комп №1, есть...

Как начинать делать многопользовательскую игру? (упрощенный в 100 раз аналог Цивилизации)?
Всем привет! Вопрос такой. Просмотрел море уроков по Unity - но ответа так и не нашел. Как...

4
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
13.10.2020, 01:38 2
UITableView сделан так, что он может нарисовать любое количество ячеек. по факту, физически количество ячеек в памяти создается чуть больше, чем умещается в пределах одного экрана. а потом одна и та же ячейка многократно перерисовывается нужным контентом.

для этого у таблицы есть метод
dequeueReusableCell
https://developer.apple.com/do... usablecell

он принимает два параметра 1) строковый идентификатор ячейки 2) текущий indexPath

чтобы метод работал, нужно зарегистрировать этот идентификатор. это можно сделать или в IB, или программно при помощи метода
register
https://developer.apple.com/do... 8-register

контроллеру нужно реализовать метод делегата UITableViewDataSource

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

который создаст ячейку в таблице и заполнит ее нужным контентом

примерно это выглядит так. нужно помнить, что одна и та же ячейка может многократно переиспользоваться, поэтому метод show() должен полностью перерисовать ее содержимое текущим контентом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
classMyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    // MARK: Outlets
 
    @IBOutlet weak var TableView: UITableView!
 
    // MARK: Property
    var data  = [CellData]()
 
    // MARK: Methods
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // заполняем data
    }
 
    // MARK: UITableViewDelegate, UITableViewDataSource
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 40.0
    }
 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }
 
    // здесь у таблицы в IB уже отрисован шаблон ячейки, которой присвоен идентификатор "cellIdentifier"
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cellData= self.data[indexPath.row]
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath) as? MyViewCell else { return UITableViewCell() }
        
        // заполняем ячейку нужными данными и отрисовываем
        cell.data = cellData
        cell.show()
        
        return cell
    }
}
1
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
13.10.2020, 17:59  [ТС] 3
Проблема в том, что нужно реализовать класс UITableVIew самому (т е создать новый класс TableView который наследуется от UIScrollView)
0
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
13.10.2020, 18:34 4
Лучший ответ Сообщение было отмечено Megus как решение

Решение

так а в чем проблема сделать так же? у тебя известна высота ячеек, известна высота экрана девайса. исходя из этого вычисляешь количество ячеек в памяти, чтобы они закрыли весь экран + 2 дополнительные (+1 сверху и +1 снизу). зная общее количество отображаемых ячеек, вычисляешь contentSize у UIScrollView. при пролистывании скролла через contentOffset получаешь текущую видимую точку, из нее вычисляешь текущую (indexPath) ячейку и все соседние, которые помещаются на экране. и для отображения конкретной видимой ячейки вычисляешь, какую из заранее созданных (в памяти) нужно взять. чтобы перерисовать на ней весь контент. именно так и сделана стандартная таблица.
1
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
13.10.2020, 21:16  [ТС] 5
Понял, спасибо
0
13.10.2020, 21:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2020, 21:16
Помогаю со студенческими работами здесь

Реализовать пользовательский класс Pair (упрощённый аналог std::pair)
Здравствуйте. Проблема с выводом. В приложенном задании, требуется сделать вывод как в примере. Мой...

Разработать приложение, имитирующее упрощенный аналог игры "Кто хочет стать миллионером"
Разработать приложение,имитирующее упрощенный аналог игры <Кто хочет стать миллионером!> ....

Поле со ссылкой на собственную таблицу
В таблице организаций необходимо сделать поле - головная организация со ссылкой на ту же таблицу....

Написать собственную функцию ToLower
Как создать метод, типа "собственный ToLower", что бы в строке строчные буквы английского алфавита...

Написать собственную функцию isalnum
Подскажите, как можно написать самому функцию iswalnum?

Написать собственную реализацию функции copy.
Написать собственную реализацию функции copy.Сравнить результаты работы стандартного и своего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru