/* at Name, Date Text */
Text("from: **\(eachKnock.sentUserName)**")
.font(.body)
.id(eachKnock.sentUserName)
Text("\(eachKnock.knockedDate.dateValue().timeAgoDisplay())")
.font(.subheadline)
.foregroundColor(Color(.systemGray))
.padding(.leading, -10)
.id(eachKnock.knockedDate.dateValue().timeAgoDisplay())
간단히 말하면, .id(_:)
가 붙은 뷰들은 해당 id의 값이 변하면 해당 뷰의 identity를 reset한다.
When the proxy value specified by the id parameter changes, the identity of the view — for example, its state — is reset.
출처: https://developer.apple.com/documentation/swiftui/view/id(_:)
그럼 뷰의 identity에 대한 내용도 알아야 할 것인데, 해당 내용은 이전 WWDC 영상 내용을 정리한 내 게시글에 일부 담겨있다.
특정 뷰의 id가 명시적으로 주어지지 않을 때, 뷰 계층은 계층 내의 placement에 따라 id를 제공한다(SwiftUI가 자체적으로). 뷰 transition이나 문제가 생기지 않는다면,
위에 공유된 게시글 내용대로, 랜덤한 id는 안정적이지 않기 때문에 동일한 동작을 보장하지 않을 수 있다.
.id(_:)
모디파이어에 걸리는 모든 뷰는 동적으로 또 다시 id를 갖게 되기 때문에 상당히 이상한 결과를 보인다.Insertion
과 removal
을 동작하기 때문이다.만약 당신이 if절을 통해 2개 이상의 뷰를 분기처리한다고 해보자. 이 경우, 각 뷰는 서로 다른 id를 가지는 뷰 타입으로 SwiftUI에 의해 추론되어 transition을 일으킨다.
흥미로운 사실은 id에 전달하는 값들도 메소드나 삼항연산자로 처리하여 "identity를 건드려서 특정 조건에서만 애니메이션이 작동하도록" 할 수가 있다는 점이다.
내 경우, 간단한 커스텀 Transition을 활용해서 뷰를 구성하면서 id를 이해하는 것이 더 도움이 되었다!
/* Transition 예시코드 */
public let trailingTransition = AnyTransition
.asymmetric(
insertion: .move(edge: .trailing),
removal: .move(edge: .trailing)
)
public let leadingTransition = AnyTransition
.asymmetric(
insertion: .move(edge: .leading),
removal: .move(edge: .leading)
)
23.03.28.