UISplitViewController 사용법: 마스터-디테일 인터페이스 구현

작성일 :

UISplitViewController 사용법: 마스터-디테일 인터페이스 구현

마스터-디테일 인터페이스는 iOS 애플리케이션에서 데이터를 관리하고 사용자 경험을 최적화하는 데 자주 사용되는 디자인 패턴입니다. 이 패턴은 리스트 형태의 '마스터' 뷰와, 특정 아이템의 세부 정보를 보여주는 '디테일' 뷰로 구성됩니다. Swift에서 이 구조를 쉽게 구현할 수 있는 도구가 바로 UISplitViewController입니다. 이 글에서는 UISplitViewController를 사용하여 마스터-디테일 인터페이스를 구현하는 방법을 단계별로 설명하겠습니다.

UISplitViewController 기본 설정

UISplitViewController는 기본적으로 두 개의 뷰 컨트롤러를 포함합니다. primary 뷰 컨트롤러와 secondary 뷰 컨트롤러입니다. 각각의 뷰 컨트롤러는 아래와 같은 형태로 Swift 코드에서 설정할 수 있습니다.

swift
class 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) 형식으로 표현합니다. 아래는 기본적인 마스터 뷰 컨트롤러의 예제입니다.

swift
import 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 메서드가 호출되며, 디테일 뷰 컨트롤러에 해당 데이터를 전달합니다.

디테일 뷰 컨트롤러 구현

디테일 뷰 컨트롤러는 마스터 뷰에서 선택된 아이템의 상세 정보를 표시합니다. 아래는 기본적인 디테일 뷰 컨트롤러의 예제입니다.

swift
import 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 속성을 사용할 수 있습니다.

swift
splitViewController.preferredDisplayMode = .allVisible

이 설정은 두 개의 뷰 컨트롤러가 항상 화면에 표시되도록 합니다. 또 다른 유용한 설정으로는 isCollapsed 속성을 통해 현재 뷰 컨트롤러가 축소 모드인지 확인하는 것입니다.

swift
func splitViewController(_ svc: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
    return true
}

이 메서드는 작은 화면 크기에서 디테일 뷰 컨트롤러가 별도의 네비게이션 스택에서 표시되는 대신 마스터 뷰 컨트롤러의 네비게이션 스택에 병합되도록 합니다.

결론

UISplitViewController를 사용하면 iOS 애플리케이션에서 마스터-디테일 인터페이스를 손쉽게 구현할 수 있습니다. 이 글에서 설명한 예제를 통해 UISplitViewController의 기본 사용법을 이해할 수 있었을 것입니다. 더 나아가 다양한 설정 옵션과 사용자 경험을 개선할 수 있는 방법들을 추가로 탐구해 보세요. 이렇게 하면 더욱 직관적이고 사용하기 편리한 애플리케이션을 만들 수 있을 것입니다.