궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFTUI/Controls

SwiftUI : EditButton [onDelete, OnMove]

서근
QUOTE THE DAY

“ 위대한 과학은 거인의 어깨 위에 거인이 올라선 경우처럼 대단하게 비유된다. 하지만, 소프트웨어 산업은 난쟁이 발가락 위에 난쟁이가 서있는 것처럼 매우 쉽게 이야기 된다. ”

- Alan Cooper (앨런 쿠퍼)
Written by SeogunSEOGUN

SwiftUI : EditButton [onDelete, OnMove]

 

 OnDeleteOnMove에 대해 알아보도록 합시다.

EditButton

현재 편집 범위에 대한 편집 모드를 toggle하는 버튼입니다.

 

SwiftUI는 컬렉션에서 개체를 삭제하는 방법을 제어하는 데 사용할 onDelete()수정자를 제공합니다. 이 기능은 목록 및 각 행에만 거의 사용됩니다. 각 행에 표시되는 행 목록을 만든 다음, 각 행에 대해 OnDelete()를 추가해 사용자가 원하지 않는 행을 제거 또는 이동할 수 있습니다.

버튼 토글시 새로운 번호 생성

 숫자 표시되는 목록을 만들고 버튼을 누를 때마다 새 번호가 나타나게 만들어 봅시다. 그 코드는 다음과 같습니다.

swift
UNFOLDED
import SwiftUI
struct ContentView: View {
@State private var numbers = [Int]()
@State private var currentNumber = 1
var body: some View {
VStack {
List {
ForEach(numbers, id: \.self) {
Text("\($0)")
}
}
Button("Add Number") {
//버튼에 currenNumber를 append 해주고 눌릴때마다 '+1'씩늘어남
self.numbers.append(self.currentNumber)
self.currentNumber += 1
}
}
}
}

OnDelete()이 작동하려면 IndexSet 형식의 단일 parameter를 수신할 메서드를 구현해야 합니다. 이것은 정수의 집합과 약간 비슷하지만, 정렬되어 있습니다. 

 

각 항목에 대해 제거해야 할 모든 항목의 위치를 알려 줍니다. ForEach 는 정렬을 하기 위한 코드 이기 때문에 이 코드의 정렬을 제거하기 위해서는 indexSet을 수용하는 remove(atOffsets:) 메서드가 있습니다.

swift
UNFOLDED
func removeRows(at offsets: IndexSet) {
numbers.remove(atOffsets: offsets)
}

이제 removeRows 를 할당시켜 줘야 하는데. .onDelete(perform: removeRoes)를 추가합니다.

그리고 위의 removeRows 함수를 작성하여 주면, 기능이 정상적으로 실행됩니다.

swift
UNFOLDED
struct ContentView: View {
@State private var numbers = [Int]()
@State private var currentNumber = 1
var body: some View {
VStack {
List {
ForEach(numbers, id: \.self) {
Text("\($0)")
}
.onDelete(perform: removeRoes)
}
Button("Add Number") {
//버튼에 currenNumber를 append 해주고 눌릴때마다 '+1'씩늘어남
self.numbers.append(self.currentNumber)
self.currentNumber += 1
}
}
}
func removeRoes(at offsets: IndexSet) {
numbers.remove(atOffsets: offsets)
}
}

SwiftUI : EditButton [onDelete, OnMove] - EditButton - 버튼 토글시 새로운 번호 생성

한 단계 더 나아가서 Navigation View를 생성해, 전체 선택 또는 개별 선택으로 한 번에 삭제할 수 있습니다.

 

VStack 위에 NavigationView를 덮고, 그 NavigationView안에 아래 두 가지 아이템 중에 하나를 선택해 추가해주면 됩니다.

.navigationBarItems(leading: EditButton())  

.toolbar { EditButton() }

그럼 화면 상단 왼쪽에 Edit 버튼이 생기고 그것을 클릭하면 다중 선택 후 삭제가 가능합니다.

swift
UNFOLDED
struct ContentView: View {
@State private var numbers = [Int]()
@State private var currentNuber = 1
var body: some View {
NavigationView {
VStack {
List { ... }
.navigationBarItems(leading: EditButton())
}
}
func removeRow(at offsets: IndexSet) {
numbers.remove(atOffsets: offsets)
}
}

SwiftUI : EditButton [onDelete, OnMove] - EditButton - 버튼 토글시 새로운 번호 생성

전체코드

더보기
swift
UNFOLDED
struct ContentView: View {
@State private var numbers = [Int]()
@State private var currentNuber = 1
var body: some View {
NavigationView {
VStack {
List {
ForEach(numbers, id:\.self) {
Text("\($0)")
}
.onDelete(perform: removeRow)
}
Button("Add Number") {
//버튼에 currenNumber를 append 해주고 눌릴때마다 '+1'씩늘어남
self.numbers.append(self.currentNuber)
self.currentNuber += 1
}
}
.navigationBarItems(leading: EditButton())
}
}
func removeRow(at offsets: IndexSet) {
numbers.remove(atOffsets: offsets)
}
}

List 이동 또는 삭제

먼저, @State private var로 과일의 배열을 만든 후, NavigationView, List, ForEach문을 사용하여 과일명을 나열해줍니다.

swift
UNFOLDED
@State private var fruits = [
"사과",
"바나나",
"메론",
"참외"
]
var body: some View {
NavigationView{
List {
ForEach(
fruits, id: \.self) { fruit in
Text(fruit)
}

이제  onDelete(perform:) 과 onMove(perform:) 를 사용해서 목록이 이동되거나 삭제되도록 코드를 작성해 줍니다.

swift
UNFOLDED
NavigationView{
List {
ForEach(
fruits, id: \.self) { fruit in
Text(fruit)
}
.onDelete(perform: removeFriut)
.onMove(perform: moveFriut)
}

onDelete()onMove() 코드를 사용하기 위해서는 body 밖에 함수를 추가해줘야 합니다.

swift
UNFOLDED
var body: some View {
NavigationView { ... }
//Mark : Remove 와 move의 함수를 만들어준다.
}
func removeFriut(at offsets: IndexSet) {
fruits.remove(atOffsets: offsets)
}
func moveFriut(from source: IndexSet, to destination: Int) {
fruits.move(fromOffsets: source, toOffset: destination)
}

마지막으로 Navigation Title과 오른쪽 상단의 Edit 버튼을 추가해 보도록 하겠습니다.

내비게이션에 Edit 버튼을 추가하는 방법은 여러 가지가 있지만 오늘은 두 가지만 일단 알아보도록 하겠습니다.

  1.  .toolbar { EditButton() }
  2.  .navigationBarItems(trailing: EditButton())
swift
UNFOLDED
NavigationView{
List { ... }
.navigationTitle("과일")
//네비게이션바 오른쪽 상단에 edit를 추가하는 두가지 방법이다.
// .toolbar { EditButton() }
.navigationBarItems(trailing: EditButton())
}

 

SwiftUI : EditButton [onDelete, OnMove] - List 이동 또는 삭제

전체코드

더보기
swift
UNFOLDED
struct ContentView: View {
@State private var fruits = [
"사과",
"바나나",
"메론",
"참외"
]
var body: some View {
NavigationView{
List {
ForEach(
fruits, id: \.self) { fruit in
Text(fruit)
}
.onDelete(perform: removeFriut)
.onMove(perform: moveFriut)
}
.navigationTitle("과일")
//네비게이션바 오른쪽 상단에 edit를 추가하는 두가지 방법이다.
.toolbar { EditButton() }
// .navigationBarItems(trailing: EditButton())
}
//Mark : Remove 와 move의 함수를 만들어준다.
}
func removeFriut(at offsets: IndexSet) {
fruits.remove(atOffsets: offsets)
}
func moveFriut(from source: IndexSet, to destination: Int) {
fruits.move(fromOffsets: source, toOffset: destination)
}
}

읽어주셔서 감사합니다🤟

 

잘못된 내용이 있으면 언제든 피드백 부탁드립니다.

'SWIFTUI > Controls' 카테고리의 다른 글

SwiftUI : Toggle Switch (toggleStyle)  (0) 2021.03.18
SwiftUI : Alert (알림 메세지)  (0) 2021.01.23
SwiftUI : Button / onTapGesture  (4) 2021.01.23
SwiftUI : TextEditor  (0) 2021.01.21
SwiftUI : SecureField  (0) 2021.01.21


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.