【초보자】Swift UI를 공부한다 그 ⑨ ーーー Identifiable 프로토콜
소개
전회는 카드의 애니메이션을 깨끗하게 할 수 있었습니다.
그러나, 카드 1장만의 경우는 그것으로 좋지만, 100장의 경우는 1개 1개 만들 수는 없습니다.
이번에는 이것에 대해 해 나갈 것입니다. 완성품↓
목차
Identifiable 프로토콜 · 우선은 데이터 모듈 파일 Course를 작성합니다. ・Identifiable 사용하는 것으로, title나 subtitle 등, 다른 데이터 필드가 변경되어도, id 프로퍼티를 사용하면 특정의 데이터를 식별할 수 있습니다. ・전부는 싣지 않습니다만, 데이터는 course[] 컬렉션에 더해 갑니다. 또한 id는 자동 생성이므로 컬렉션에 준비할 필요가 없습니다. Course.swift struct Course: Identifiable { var id = UUID() var title: String var subtitle: String var color: Color var image: String var logo: String var show: Bool var index: Double } var courses = [ Course ( title: "UI Design for iOS 14", subtitle: "20 sections", color: Color(.blue), image: "Illustration 1", logo: "Logo UI Design", show: false, index: -1 ) ] ・ CoursesView 로 되돌려, 전회의 기사에서는 2번째의 카드를 작성했지만, 100장을 만들고 싶을 때는 당연합니다만, 루프를 사용합니다. · item은 왜 id를 가지는지에 대해, 클로저 를 살펴 보겠습니다.
item에 커서를 맞추고
CTRL+CMD+j
를 누르면 Course
으로 날아갑니다.・
ForEach
로 100장의 카드를 만들었다고 하면, 1장 1장의 내용을 결정하지 않으면 안됩니다.· matchedGeometryEffect의 식별자는
courses[].id
로 바뀝니다. 여기의 인수 20은 몇번째의 카드를 탭해도 0번째의 카드가 열립니다.CoursesView.swift
if show {
ScrollView {
CourseItem()
.matchedGeometryEffect(
id: courses[0].id, in: namespace
)
.frame(height: 300)
VStack {
ForEach(0 ..< 20) { item in
CourseRow()
}
}
.padding()
}
}
·
Course.swift
를 작성하여 CourseItem.swift
로 정수로 결정한 Image
와 Text
를 데이터 모듈로 변경합니다.CoursesItem.swift
var course: Course = courses[0]
var body: some View {
VStack(alignment: .leading, spacing: 4.0) {
Spacer()
HStack {
Spacer()
Image(course.image)
.resizable()
.aspectRatio(contentMode: .fit)
Spacer()
}
Spacer()
Text(course.title)
.fontWeight(.bold)
.foregroundColor(Color.white)
Text(course.subtitle)
.font(.footnote)
.foregroundColor(Color.white)
}
· 아직
CoursesView.swift
로 돌아가서 CourseItem()
에 인수를 추가합니다.CoursesView.swift
ScrollView {
VStack(spacing: 20) {
ForEach(courses) { item in
CourseItem(course: item)
.matchedGeometryEffect(
id: item.id, in: namespace, isSource: !show
)
.frame(width: 335, height: 250)
}
}
.frame(maxWidth: .infinity)
}
if show {
ScrollView {
CourseItem(course: courses[0])
.matchedGeometryEffect(id: courses[2].id, in: namespace)
.frame(height: 300)
VStack {
ForEach(0 ..< 20) { item in
CourseRow()
}
}
.padding()
}
요약 · 이번에는 Identifiable 프로토콜을 사용하여 Course Struct를 고유하게 식별할 수 있도록 했다. 그러나 선택한 CourseItem은 여전히 courses[0]처럼 고정 상태로 유지됩니다. 다음에 이것을 해결합니다. 소스 코드 Github
참고문헌
Reference
이 문제에 관하여(【초보자】Swift UI를 공부한다 그 ⑨ ーーー Identifiable 프로토콜), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/anchor_/items/d7c2d07dfd13b54b653a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)