iOS/SwiftUI

[SwiftUI] @ToolbarContentBuilder로 가독성 개선

crazydeer 2024. 3. 14. 08:00
반응형

🧑‍💻 코드

import SwiftUI

public struct SampleView: View {
  @State var title: String = "Hi, guys"
  @Environment(\\.presentationMode) var presentationMode: Binding
  
  public var body: some View {
    VStack {
      Text(title)
        .font(.system(size: 26, weight: .bold))
        .foregroundColor(.black)
        .padding()
      
      NavigationLink {
        BaseWebView(url: "<https://www.google.com>")
      } label: {
        Text("구글 웹사이트")
          .padding()
      }
      
      Spacer()
    }
    .navigationBarTitleDisplayMode(.inline)
    .navigationBarBackButtonHidden()
    .toolbar {
      toolbarContent()
    }
  }
  
  @ToolbarContentBuilder
  private func toolbarContent() -> some ToolbarContent {
    ToolbarItem(placement: .principal) {
      Text("Download")
    }
    
    ToolbarItem(placement: .navigationBarLeading) {
      backButton
    }
    
    ToolbarItem(placement: .navigationBarTrailing) {
      actionButtons
    }
  }
  
  private var backButton: some View {
    Image(systemName: "chevron.backward")
      .padding(.horizontal, 8)
      .onTapGesture {
        self.presentationMode.wrappedValue.dismiss()
      }
  }
  
  private var actionButtons: some View {
    HStack(spacing: 0) {
      Image(systemName: "dot.radiowaves.left.and.right")
        .padding(.horizontal, 8)
        .onTapGesture {
          title = "라디오 버튼 선택함"
        }
      Image(systemName: "heart.fill")
        .padding(.horizontal, 8)
        .onTapGesture {
          title = "하트 버튼 선택함"
        }
    }
  }
  
}

 

@ToolbarContentBuilder

https://developer.apple.com/documentation/swiftui/toolbarcontentbuilder

 

ToolbarContentBuilder | Apple Developer Documentation

Constructs a toolbar item set from multi-expression closures.

developer.apple.com

some ToolbarContent를 return하는 메서드를 만들어서 View의 body 아래 부분의 가독성을 개선해줄 수 있음

 

추가 설명

@ToolbarContentBuilder는 SwiftUI에서 툴바 컨텐츠를 구성할 때 사용하는 특별한 빌더입니다. SwiftUI는 다양한 뷰를 조합하여 사용자 인터페이스를 구축하는 선언적 프레임워크이며, @ToolbarContentBuilder는 이러한 패러다임을 툴바 컨텐츠의 구성에 적용합니다. @ToolbarContentBuilder를 사용하면 복잡한 툴바를 보다 구조적이고 선언적인 방식으로 정의할 수 있습니다.

 

Usage

@ToolbarContentBuilder는 함수나 계산된 변수 앞에 붙는 속성(어트리뷰트)입니다. 이를 사용하면 여러 툴바 아이템을 그룹화하여 한 번에 반환할 수 있습니다. SwiftUI는 이 어트리뷰트가 붙은 함수나 변수 내부에서 생성된 모든 툴바 아이템을 자동으로 인식하고, 이를 툴바로 구성합니다.

 

.toolbar {
    toolbarContent()
}

 

 

- 툴바 아이템(ToolbarItem): 툴바에 표시될 개별 요소를 정의합니다. 각 ToolbarItemplacement 매개변수를 통해 툴바 내의 위치를 지정할 수 있습니다.

 

- 배치(Placement): 툴바 아이템이 툴바 내에서 어디에 배치될지 결정합니다. 예를 들어, .navigationBarLeading, .navigationBarTrailing, .principal 등이 있습니다.

 

- ToolbarContentBuilder: 이 어트리뷰트는 컴파일러에게 여러 툴바 아이템을 조합하여 하나의 툴바 컨텐츠로 구성하도록 지시합니다. 이는 복잡한 툴바 구성도 간결하고 선언적인 코드로 표현할 수 있게 해줍니다.

 

@ToolbarContentBuilder를 사용함으로써, SwiftUI 앱의 툴바를 효율적으로 관리하고, 다양한 툴바 아이템을 유연하게 조합하여 사용자에게 필요한 인터페이스를 제공할 수 있습니다.

반응형