간단한 모델 주장이 있습니다.
struct Claim: Codable, Identifiable {
let id: String
var name: String
var isSelected: Bool? = nil // used for selecting claims in a list
}
AddClaimView는에 이미 저장된 클레임을 필터링 role.claims
하고 사용자가에 추가하기 위해 선택할 수 있도록 목록에 표시하기위한 것입니다 role
.
struct AddClaimView: View {
var claims: [Claim] // all possible claims
@Binding var role: Role
var claimsForAdding: [Claim] {
self.claims.filter { claim in
!self.role.claims.contains(claim)
}
}
var body: some View {
VStack {
Text("Add claim")
.font(.largeTitle)
ClaimsListRows(claims: self.claimsForAdding.sorted())
}
}
}
필터링은 계산 된 속성에 의해 수행되며 claimsForAdding
여기에 문제가 있습니다. 계산 된 속성 claimsForAdding
을 뷰 @Binding var claims
에 바인딩 ClaimsListRow
한 다음 추가하려면 role.claims
어떻게 해야 합니까?
@State var claimsForAdding....
분명히 계산 된 속성에 대해 작동하지 않습니다.
struct ClaimsListRows: View {
@Binding var claims: [Claim]
var body: some View {
List(claims) { claim in
// set property isSelected = true when tapping a row
.....
AddClaimView
시트에 표시되는 보기 :
struct RoleDetailed: View {
@Binding var role: Role
@State var showAddClaim = false
@Binding var claims: [Claim]
var body: some View {
VStack(alignment: .leading) {
HStack {
Text(role.name)
.font(.largeTitle)
Spacer()
}
Text("id: " + role.id)
.font(.footnote)
.foregroundColor(Color.gray)
List {
ForEach(role.claims) { claim in
ClaimRow(claim: claim)
}
}
}.font(.headline).padding(10)
.navigationBarItems(trailing:
Button(action: {
self.showAddClaim.toggle()
}) {
Text("Add claim")
}.sheet(isPresented: self.$showAddClaim, onDismiss: {
print("dismissed")
}, content: {
AddClaimView(claims: self.claims, role: self.$role)
})
)
}
}
내가받은 의견에서 이것은 새로운 것입니다 AddClaimView
.
struct AddClaimView: View {
var claims: [Claim]
@Binding var role: Role
var claimsForAdding: [Claim] {
get {
self.claims.filter { claim in
!self.role.claims.contains(claim)
}
}
set {
var claims = self.claims
claims.removeAll(where: { claim in
newValue.contains(claim)
})
}
}
var body: some View {
VStack {
Text("Add claim")
.font(.largeTitle)
ClaimsListRows(claims: Binding<[Claim]>(
get: {
self.claims.filter {
claim in !self.role.claims.contains(claim)
}
.sorted(by: { $0.name < $1.name })
},
set: { newValue in
var claims = self.claims
claims.removeAll(where: { claim in
newValue.contains(claim)
})
self.role.claims = claims
}
))
}
}
}
Binding
역할을 업데이트 하는 사용자 지정 을 만들어야합니다 .
ClaimsListRows(claims: Binding<[Claim]>(
get: {
self.claims.filter {
claim in !self.role.claims.contains(claim)
}
.sorted(by: { $0.name < $1.name })
},
set: { newValue in
var claims = self.claims
claims.removeAll(where: { claim in
newValue.contains(claim)
})
self.role.claims = claims
}
))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다