UICollectionViewListCell, das in Xcode12 enthalten ist, ist ein neuer UI-Teil, der UITableView in Bezug auf die Funktionalität ersetzt. Mit UICollectionViewListCell können Sie einen UITableView-ähnlichen Bildschirm erstellen.
Dies bedeutet, dass es für UITableView nutzlos ist ...
Daher werde ich versuchen, "UICollectionViewListCell" zu verwenden, das in Zukunft bei der Anzeige des Listenformatbildschirms verwendet wird.
Dieses Mal wollte ich eine Liste im Format "insetGrouped" anzeigen, also habe ich sie wie folgt eingestellt.
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Titel"
collectionView.collectionViewLayout = createLayout()
}
private func createLayout() -> UICollectionViewLayout {
let config = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
let layout = UICollectionViewCompositionalLayout.list(using: config)
return layout
}
Jetzt sind Sie bereit für ein Listenlayout wie das Gesundheitswesen.
Führen Sie dieses Mal die API aus, um den Artikel von Qiita abzurufen und den Titel auf dem Bildschirm anzuzeigen. Erstellen Sie daher einen Prozess, um die Liste der Artikel abzurufen. Verwenden Sie Alamofire
private func getData() {
AF.request(
"https://qiita.com/api/v2/items",
method: .get
).responseJSON { response in
switch response.result {
case .success:
if let data = response.data {
let json = try! JSONDecoder().decode([ItemsResponse].self, from: data)
print(json)
}
case let .failure(error):
print(error)
}
}
}
struct ItemsResponse: Codable, Hashable {
let body: String?
let coediting: Bool?
let commentsCount: Int?
let createdAt: String?
let group: String?
let id: String?
let likesCount: Int?
let pageViewsCount: String?
let privateField: Bool?
let reactionsCount: Int?
let renderedBody: String?
let tags: [Tag]?
let title: String?
let updatedAt: String?
let url: String?
let user: User?
}
struct User: Codable, Hashable {
let descriptionField: String?
let facebookId: String?
let followeesCount: Int?
let followersCount: Int?
let githubLoginName: String?
let id: String?
let itemsCount: Int?
let linkedinId: String?
let location: String?
let name: String?
let organization: String?
let permanentId: Int?
let profileImageUrl: String?
let teamOnly: Bool?
let twitterScreenName: String?
let websiteUrl: String?
}
struct Tag: Codable, Hashable {
let name: String?
let versions: [String]?
}
Sie können den JSON der Antwort abrufen, indem Sie die damit erstellte Methode ausführen.
Legen Sie zunächst die Abschnittskonfiguration der Sammlungsansicht fest. Dieses Mal wollte ich es zu einem einfachen Abschnitt machen, also habe ich die folgende Aufzählung erstellt.
extension FirstViewController {
enum Section {
case main
}
}
Registrieren Sie als Nächstes, wie angezeigt werden soll. In Bezug auf TableView denke ich, dass es sich um einen Prozess handelt, der UITableViewDataSource ähnelt.
private func setupCollectionView() {
let registration = UICollectionView.CellRegistration<UICollectionViewListCell, ItemsResponse> { cell, _, text in
var content = cell.defaultContentConfiguration()
//Legen Sie den Titel des Artikels fest
content.text = text.title
cell.contentConfiguration = content
}
dataSource =
UICollectionViewDiffableDataSource<Section,
ItemsResponse>(collectionView: self.collectionView) { collectionView, indexPath, text in
collectionView
.dequeueConfiguredReusableCell(using: registration,
for: indexPath,
item: text)
}
}
Es ist wie ein Schnappschuss und das Hinzufügen von Abschnitten und Elementen ...
private func populate(with response: [ItemsResponse]) {
var snapshot = NSDiffableDataSourceSnapshot<Section, ItemsResponse>()
snapshot.appendSections([.main])
snapshot.appendItems(response)
dataSource?.apply(snapshot)
}
Am Ende wurde es eine Klasse wie diese.
import Alamofire
import UIKit
class FirstViewController: UIViewController {
@IBOutlet private weak var collectionView: UICollectionView!
private var dataSource: UICollectionViewDiffableDataSource<Section, ItemsResponse>?
private var displayData: [ItemsResponse] = []
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Titel"
collectionView.collectionViewLayout = createLayout()
setupCollectionView()
getData()
}
private func createLayout() -> UICollectionViewLayout {
let config = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
let layout = UICollectionViewCompositionalLayout.list(using: config)
return layout
}
private func setupCollectionView() {
let registration = UICollectionView.CellRegistration<UICollectionViewListCell, ItemsResponse> { cell, _, text in
var content = cell.defaultContentConfiguration()
content.text = text.title
cell.contentConfiguration = content
}
dataSource =
UICollectionViewDiffableDataSource<Section,
ItemsResponse>(collectionView: self.collectionView) { collectionView, indexPath, text in
collectionView
.dequeueConfiguredReusableCell(using: registration,
for: indexPath,
item: text)
}
}
private func populate(with response: [ItemsResponse]) {
var snapshot = NSDiffableDataSourceSnapshot<Section, ItemsResponse>()
snapshot.appendSections([.main])
snapshot.appendItems(response)
dataSource?.apply(snapshot)
}
private func getData() {
AF.request(
"https://qiita.com/api/v2/items",
method: .get
).responseJSON { response in
switch response.result {
case .success:
if let data = response.data {
let json = try! JSONDecoder().decode([ItemsResponse].self, from: data)
self.populate(with: json)
}
case let .failure(error):
print(error)
}
}
}
}
extension FirstViewController {
enum Section {
case main
}
}
///Für die Qiita-Artikelzuordnung
struct ItemsResponse: Codable, Hashable {
let body: String?
let coediting: Bool?
let commentsCount: Int?
let createdAt: String?
let group: String?
let id: String?
let likesCount: Int?
let pageViewsCount: String?
let privateField: Bool?
let reactionsCount: Int?
let renderedBody: String?
let tags: [Tag]?
let title: String?
let updatedAt: String?
let url: String?
let user: User?
}
struct User: Codable, Hashable {
let descriptionField: String?
let facebookId: String?
let followeesCount: Int?
let followersCount: Int?
let githubLoginName: String?
let id: String?
let itemsCount: Int?
let linkedinId: String?
let location: String?
let name: String?
let organization: String?
let permanentId: Int?
let profileImageUrl: String?
let teamOnly: Bool?
let twitterScreenName: String?
let websiteUrl: String?
}
struct Tag: Codable, Hashable {
let name: String?
let versions: [String]?
}
Schnell Es ist so lange her, dass ich vergessen habe, wie man UICollectionViewDiffableDataSource verwendet ... Nicht nur "UICollectionViewListCell", sondern "UICollectionView" selbst hat sich erheblich weiterentwickelt, daher werde ich mein Bestes geben, um auf dem Laufenden zu bleiben!
Als nächstes werde ich die Aktualisierungsverarbeitung und die zusätzliche Leseverarbeitung usw. hinzufügen und zu einer Ebene übergehen, die als Anwendung verwendet werden kann.
Recommended Posts