WWDC 2022 - SwiftUI(1)

유재경·2022년 6월 19일

iOS New Release

목록 보기
6/12

(※ iOS 16+ 지원)

NavigationView의 역할을 기본적으로 하고 있으며, 약간의 포맷이 달라졌다.

// NavigationStack
NavigationStack {
	List(parks) { park in 
		NavigationLink(park.name, value: park)
	}
	 .navigationDestination(for: Park.self) { park in
		ParkDetailView(park: park)
 	}
}


// NavigationView
NavigationView {
	List(parks) { park in 
		NavigationLink(destination: ParkDetailView(park: park)) {
			Text(park.name)
		}
	}
}

NavigationStack에는 path라는 @Binding을 통해 Navigation State를 관리할 수 있으며, 상황에 따라 일부 혹은 변화된 Navigation State만 보여줄 수 있는 장점이 있다.

@State private var presentedPark: [Park] = []

func showParks() {
	presentedPark = [Park("Yosemite"), Park("Olympic Park")]
}

NavigationStack(path: $presentedPark) {
	List(parks) { park in 
		NavigationLink(park.name, value: park)
	}
	 .navigationDestination(for: Park.self) { park in
		ParkDetailView(park: park)
 	}
}

NavigationPath라는 인스턴스를 사용하면 타입(ex. Int, String)이 서로 다른 Destination으로 이동할 수 있다. navigationDestination 은 NavigationStack 안에서 정의되어야 하며, for에는 사용될 타입을 정의해줘야 한다. 상당히 화면이 복잡한 앱에서 유용하게 사용될 듯하다.

@State private var presentedNumbers = NavigationPath()

NavigationStack(path: $presentedNumbers) {
  NavigationLink(value: "Example String") {
      Text("Tap Me")
  }
  List(1..10) { i in
	 NavigationLink(value: i) {
      Text("Row: \(i)")
    }
  }
  .navigationDestination(for: Int.Self) { i in
      Text("Int Detail: \(i)")
  }
  .navigationDestination(for: String.Self) { s in
      Text("String Detail: \(s)")
  }
}

2~3개 컬럼을 가지는 경우 NavigationSplitView를 사용할 수 있다. 주로 iPad에서 사용할 것 같고, 여러 번 선택해야 하는 경우에 유용할 것으로 보인다. ex. A,B,C 선택에 따라 칼럼 값을 다르게 보여줘야하는 경우

@State private var departmentId: Department.ID? // Single selection.
@State private var employeeIds: Set<Employee.ID> = [] // Multiple selection.

var body: some View {
  NavigationSplitView {
      List(model.departments, selection: $departmentId) { department in
          Text(department.name) // 첫 칼럼 선택
      }
  } content: {
      if let department = model.department(id: departmentId) {
          List(department.employees, selection: $employeeIds) { employee in
              Text(employee.name) // 두번째 칼럼 선택
          }
      } else {
          Text("Select a department")
      }
  } detail: {
      EmployeeDetails(for: employeeIds)
  }
}

다양한 Customize를 지원하고 있다.

leading 칼럼의 가시성을 컨트롤할 수 있다.

  • detailOnly: trailing 칼럼빼고 모두 숨김
  • doubleColumn: 3개의 칼럼 중 가장 leading에 있는 칼럼만 숨김
  • all: 모든 칼럼 다 보여줌
  • automatic: 현재 상황에 따라 알맞게 보여줌

칼럼의 너비를 자유롭게 조정할 수 있음

NaivationSplitViewStyle을 통해서 NaivationSplitView의 모양과 상호작용을 컨트롤할 수 있다.

  • AutomaticNavigationSplitViewStyle, BalancedNavigationSplitViewStyle, ProminentDetailNavigationSplitViewStyle

SwiftUI 초창기부터 사용되었던 NavigationView는 iOS 16버전까지만 지원되고 Deprecated될 예정(..!)
공식 문서에 따르면, 위의 NavigationStack과 NavigationSplitView로 대체하여 사용할 것을 권장하며, 아마도 NavigationView의 한계점을 느끼고 다양하게 커스텀할 수 있는 강력한 기능을 제공하기 위함으로 생각된다.

참고 문서

profile
iOS 개발

0개의 댓글