UISplitViewController 사용법: 마스터-디테일 인터페이스 구현
UISplitViewController 사용법: 마스터-디테일 인터페이스 구현
마스터-디테일 인터페이스는 iOS 애플리케이션에서 데이터를 관리하고 사용자 경험을 최적화하는 데 자주 사용되는 디자인 패턴입니다. 이 패턴은 리스트 형태의 '마스터' 뷰와, 특정 아이템의 세부 정보를 보여주는 '디테일' 뷰로 구성됩니다. Swift에서 이 구조를 쉽게 구현할 수 있는 도구가 바로 UISplitViewController
입니다. 이 글에서는 UISplitViewController
를 사용하여 마스터-디테일 인터페이스를 구현하는 방법을 단계별로 설명하겠습니다.
UISplitViewController 기본 설정
UISplitViewController
는 기본적으로 두 개의 뷰 컨트롤러를 포함합니다. primary
뷰 컨트롤러와 secondary
뷰 컨트롤러입니다. 각각의 뷰 컨트롤러는 아래와 같은 형태로 Swift 코드에서 설정할 수 있습니다.
swiftclass SplitViewController: UISplitViewController, UISplitViewControllerDelegate { override func viewDidLoad() { super.viewDidLoad() self.delegate = self let masterViewController = UINavigationController(rootViewController: MasterViewController()) let detailViewController = UINavigationController(rootViewController: DetailViewController()) self.viewControllers = [masterViewController, detailViewController] } }
이 코드에서는 UISplitViewControllerDelegate
를 사용하여 분할 뷰 컨트롤러의 행동을 제어하고 있습니다. viewDidLoad
메서드 내부에서는 마스터와 디테일 뷰 컨트롤러를 UINavigationController
로 래핑한 후 viewControllers
배열에 추가합니다.
마스터 뷰 컨트롤러 구현
마스터 뷰 컨트롤러는 주로 데이터를 리스트(예: UITableView
) 형식으로 표현합니다. 아래는 기본적인 마스터 뷰 컨트롤러의 예제입니다.
swiftimport UIKit class MasterViewController: UITableViewController { let items = ["Item 1", "Item 2", "Item 3"] override func viewDidLoad() { super.viewDidLoad() self.title = "Master" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = items[indexPath.row] return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let detailVC = DetailViewController() detailVC.item = items[indexPath.row] showDetailViewController(UINavigationController(rootViewController: detailVC), sender: self) } }
이 코드에서는 UITableViewController
를 상속받아 마스터 뷰 컨트롤러를 구현하고 있습니다. items
배열에 데이터를 저장하고, 이를 테이블 뷰에 표시합니다. 특정 셀이 선택되면 didSelectRowAt
메서드가 호출되며, 디테일 뷰 컨트롤러에 해당 데이터를 전달합니다.
디테일 뷰 컨트롤러 구현
디테일 뷰 컨트롤러는 마스터 뷰에서 선택된 아이템의 상세 정보를 표시합니다. 아래는 기본적인 디테일 뷰 컨트롤러의 예제입니다.
swiftimport UIKit class DetailViewController: UIViewController { var item: String? { didSet { configureView() } } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .white configureView() } func configureView() { if let item = item { self.title = item let label = UILabel() label.text = "Detail for \(item)" label.textAlignment = .center label.frame = self.view.bounds self.view.addSubview(label) } } }
이 코드에서는 UIViewController
를 상속받아 디테일 뷰 컨트롤러를 구현하고 있습니다. item
변수를 사용하여 마스터 뷰 컨트롤러에서 전달된 데이터를 설정하고, 이를 UI에 반영합니다. configureView
메서드에서 레이블을 생성하고 해당 아이템의 상세 정보를 표시합니다.
UISplitViewController 동작 제어
UISplitViewController
는 다양한 설정 옵션을 제공하여 원하는 동작을 제어할 수 있습니다. 가장 흔하게 사용되는 설정 중 하나는 iPhone처럼 작은 화면에서는 디테일 뷰 컨트롤러만 표시하고, iPad처럼 큰 화면에서는 마스터와 디테일 뷰 컨트롤러를 나란히 표시하는 것입니다. 이를 위해 preferredDisplayMode
속성을 사용할 수 있습니다.
swiftsplitViewController.preferredDisplayMode = .allVisible
이 설정은 두 개의 뷰 컨트롤러가 항상 화면에 표시되도록 합니다. 또 다른 유용한 설정으로는 isCollapsed
속성을 통해 현재 뷰 컨트롤러가 축소 모드인지 확인하는 것입니다.
swiftfunc splitViewController(_ svc: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { return true }
이 메서드는 작은 화면 크기에서 디테일 뷰 컨트롤러가 별도의 네비게이션 스택에서 표시되는 대신 마스터 뷰 컨트롤러의 네비게이션 스택에 병합되도록 합니다.
결론
UISplitViewController
를 사용하면 iOS 애플리케이션에서 마스터-디테일 인터페이스를 손쉽게 구현할 수 있습니다. 이 글에서 설명한 예제를 통해 UISplitViewController
의 기본 사용법을 이해할 수 있었을 것입니다. 더 나아가 다양한 설정 옵션과 사용자 경험을 개선할 수 있는 방법들을 추가로 탐구해 보세요. 이렇게 하면 더욱 직관적이고 사용하기 편리한 애플리케이션을 만들 수 있을 것입니다.