Replies: 1 comment 1 reply
-
오타및 오루가 있으면 알려주세요 ㅎㅎㅎ |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
ForEach
SWIFT
일반적으로
ForEach
를 사용하여SwiftUI
에서 View를 반복할 수 있습니다.TIP
ForEach
를 보고 Swift시퀀스의forEach()
방식과 동일하다고 생각하기 쉽지만, 보시는 것처럼 그렇지 않습니다.SwiftUI
의ForEach
는Struct
구조 이므로 보기 본문에서 직접 반환할 수 있습니다. 항목 배열을 제공하고, 각 항목을 고유하게 식별하여 값이 변경될 때 업데이트하는 방법을 알 수 있습니다. 또한 루프의 각 항목에 대한 뷰를 생성하기 위해 실행할 클로저를 전달합니다.아래 코드는 1부터 10까지
row
값이 화면에 나타나도록 하는 코드입니다.SWIFT
이 코드보다 더 간단하게 사용하는 방법은
Text("Row \(number")
을 ($0
) 값을 사용 하면 됩니다.SWIFT
배열의 각 요소를 고유하게 식별
id: \.self
부분은SwiftUI
가 배열의 각 요소를 고유하게 식별할 수 있도록 하기 위해 필요합니다. 즉, 항목을 추가하거나 제거하면SwiftUI
가 정확히 어떤 요소를 알고 있는지 확인할 수 있습니다.이 접근 방식을 사용하여 모든 유형의 루프를 만들 수 있습니다. 예를 들어, 다음 코드는 세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.
SWIFT
body 아래에 List 형식으로 Section을 사용하여 반복문을 만들어 보겠습니다.
SWIFT
위 결과 화면을 보면
Section
부분Header Text
에 소문자로 "first section"으로 지정해주었지만, 실제 결괏값은 대문자로 나와있는 것을 확인하실 수 있습니다. 이럴 때는.textCase(nil)
값을Section
밖에 추가하면 실제 사용자가 정해놓은 텍스트 값으로 보여주게 됩니다.SWIFT
전체 코드
SWIFT
변수값으로
ForEach
문을 사용할 수 있습니다.SWIFT
혹은 아래와 같이 만들수도 있죠.
세 가지 색상의 배열을 생성하고, 모든 색상을 반복하며, 각 색상 이름과 색상 값을 사용하여 텍스트 뷰를 생성합니다.
List
List
는 단일 열에 정렬 된 데이터 행을 표시하는 컨테이너입니다.SWIFT
정적 콘텐츠
List
의 생성자에 원하는 뷰를 전달하면 하나씩 각row
에 담아 표현합니다. 여기서 뷰 하나는row
하나에 해당합니다.TIP
UIKit에서는 UITableView에서 내용을 표시할 뷰를 셀이라고 불렀다면, SwiftUI에서는
row
라고 표현합니다.다음과 같이 텍스트가 아닌 다른 이미지 뷰를 넣어 봐도 동일하게
List
를 작성 할 수 있습니다.SWIFT
동적 콘텐츠
Range
동적 콘텐츠를 표현하는 첫번째 방법은
Range<Int
> 타입의 값을 넘겨주는 것입니다. 예를들어1
부터100
까지의 숫자를 출력하려면 다음과 같이 작성 하면 됩니다.SWIFT
RandomAccessCollection
두 번째 방법은
RandomAccessCollecion
프로토콜을 준수하는 데이터를 제공하는 것입니다. 이경우에는 데이터의 각 요소들을 구분하고 식별할 수 있도록 반드시 다음2
가지 방법 중 하나를 선택하여id
값을 제공해야만 합니다.첫 번째, id 식별자 지정
첫 번째는
id
로 사용할 값을 직접 인수로 제공하는 것입니다.SwifUI
에서는 이것을 간단히self
라고 입력할 수도 있습니다..List(["A", "B", "C", "D"], id: \.self) { ... }
두 번째, identifiable 프로토콜 채택
두 번째 방법은 매개 변수에
id
를 전달하는 대신 데이터 타입 자체에identifiable
프로토콜을 채택하는 것입니다. 타입 자체에id
프로퍼티를 만들고 이것을 식별자로 삼게 됩니다,우선
Ghibli
라는struct
를 만들고Identifiable
을 매개변수 타입으로 넣어준 후,원하는 상수와 식별가능한 코드
id = UUID()
를 작성합니다.TIP
UUID?? 유형, 인터페이스 및 기타 항목을 식별하는 데 사용할 수 있는 보편적으로 고유한 값입니다.
이제
ContentView
에List
와 위에 작성한 배열을 넣어줘야 합니다.이처럼
identifiale
프로토콜을 준수한다면, 이미 식별자가 있으므로 리스트에id
를 제공하지 않아도 무방합니다.정적 콘텐츠와 동적 콘텐츠 조합
ForEach
를 이용하면 이 두 가지를 조합하는 것도 가능합니다.ForEach
SwiftUI
에서ForEach
는List
처럼id
로 식별할 수 있는 데이터를 받아서 동적으로 뷰를 생성하는 역할을 합니다. 전달받은 매개변수도RandomAccessCollection
이나Range<Int
> 타입을 사용한다는 점도 같습니다. 그래서 아래 코드는 같은 결과를 보여주게 됩니다.SWIFT
SWIFT
하지만 리스트에서는 정적인 뷰도 포함할 수 있기 때문에,
ForEach
와 함께 사용하면 정적 + 동적 콘텐츠를 조합할 수 있는 것입니다.조합
이제 동적과 정적 콘텐츠를 조합한 예제를 살펴보도록 하겠습니다.
SWIFT
Section
섹션에는
header
와footer
를 생략하거나 추가할 수 있고, 둘 중 하나만 사용할 수 있습니다.왼: list Style미적용 / 오: GroupedListStyle 적용
ListStyle
ListStyle
을 사용하기위해서는List { ... }
/.listStyle()
처럼 리스트 밖에 스타일을 추가해줘야 합니다.ListStyle 종류
사실
ListStyle
의 종류는 다양하게 많이 있습니다. 일단IOS
에서 사용 가능한 스타일종류를 보자면 6가지 정도 됩니다.DefaultListStyle()
- 기본 리스트 스타일GroupedListStyle()
- 각 섹션을 분리된 그룹으로 묶어 표현하는 스타일InsetGroupedListStyle()
PlainListStyle()
- 데이터 목록을 각 행마다 하나씩 나열하는 형태의 기본 스타일InsetListStyle()
SidebarListStyle()
스타일을 확인 하기 위해 일단 코드를 작성해주도록 하겠습니다.
스타일 스크린샷을 확인해보면
Default
와Plain
은 똑같은 화면인 것을 확인 할 수 있는데,insetListStyle
도 똑같아 보이지만Default
/Plain
에 비해Header
부분Leading space
가 더 큽니다.Sidebar
리스트 스타일은 보시다시피 섹션을 접었다 펼 수 있는데,footer
부분은 사라지는것을 확인 할 수 있습니다.onDelete / onMove
List
내부에있는 텍스트를 옮기거나 삭제할 수 도 있습니다. 이것을 사용하려면.onDelete(perform: )
와.onMove(perform: )
를 사용하고 함수를 정의해줘야 합니다.onDelete 코드
SWIFT
onMove 코드
위 코드를 사용하기 위해서는
List
를NavigationView
로 감싸고, 그 옆에 EditButton을 추가해줘야 합니다. 이 버튼이 없으면Text
를 슬라이스 해서 삭제는 할 수 있지만Move
는 할 수 없습니다.Selection in Lists
목록 데이터의
Identifiable
단일 인스턴스에 바인딩합니다.Id
유형은 단일 선택 목록을 생성합니다.Set
에 바인딩하면 여러 선택 항목을 지원하는 목록이 생성됩니다.다음 예제 에서는 위 예제에 다중 선택을 추가하는 방법을 사용하려고 합니다. 목록 아래의Text view
에는 현재 선택된 항목 수가 표시됩니다.첫번째,
@State
변수를 추가해 줍니다.두번째,
NavigationView
를 생성 후List
에multiSelection
을 추가해줍니다.세번째,
NavigationBarTitle
을 이용하여 이름을 설정해주고, 그 옆에.toolbar { EditButton() }
를 추가해 선택 가능한 버튼을 만들어 줍니다.네번째, 화면 하단에 몇개가 선택 되었는지 표시해줍니다.
전체 코드
더보기
리스트의 여백 설정 listRowInsets
list
에는 기본적으로padding
이 들어가있습니다. 이미지를 적용시켜보면 더 쉽게 볼 수 있습니다. 이 여백을 설정하고 싶으면listRowInsets
를 사용하면 됩니다.예시와 함께 확인해보도록 하겠습니다.
우선
Mycard
라는 파일을 만들어서 아래와 같이 코드를 작성해주겠습니다.그리고
MyList
라는 새로운 파일을 생성해서 위 이미지를 호출합니다.위 코드에서
.listRowInsets(EdgeInsets.init())
가 있을 때 와 없을 때를 비교 해 볼 수 있습니다.Beta Was this translation helpful? Give feedback.
All reactions