Альтернатива переключению оператора в блоке SwiftUI ViewBuilder? - PullRequest
2 голосов
/ 24 июня 2019

Я пытался скопировать свое приложение, используя SwiftUI.Он имеет RootViewController, который, в зависимости от значения перечисления, показывает другой дочерний контроллер представления.Так как в SwiftUI мы используем представления вместо контроллеров представления, мой код выглядит так:

struct RootView : View {
   @State var containedView: ContainedView = .home

   var body: some View {
      // custom header goes here
      switch containedView {
         case .home: HomeView()
         case .categories: CategoriesView()
         ...
      }
   }
}

К сожалению, я получаю предупреждение:

Замыкание, содержащее оператор потока управленияне может использоваться с построителем функций ViewBuilder.

Итак, есть ли альтернативы для переключения, чтобы я мог повторить это поведение?

Ответы [ 2 ]

6 голосов
/ 24 июня 2019

Спасибо за ответы, ребята. Я нашел решение на форумах разработчиков Apple . На это отвечает Киль Гиллард . Решение состоит в том, чтобы извлечь переключатель из функции, как предлагали Lu_, Linus и Mo, но нам нужно заключить представления в AnyView, чтобы он работал - вот так:

struct RootView: View {
  @State var containedViewType: ContainedViewType = .home

  var body: some View {
     VStack {
       // custom header goes here
       containedView()
     }
  }

  func containedView() -> AnyView {
     switch containedViewType {
     case .home: return AnyView(HomeView())
     case .categories: return AnyView(CategoriesView())
     ... 
  }
}
3 голосов
/ 24 июня 2019

Вы должны заключить код в представление, например VStack или Group:

var body: some View {
   Group {
       switch containedView {
          case .home: HomeView()
          case .categories: CategoriesView()
          ...
       }
   }
}

или добавление возвращаемых значений должно работать:

var body: some View {
    switch containedView {
        case .home: return HomeView()
        case .categories: return CategoriesView()
        ...
    }
}

Однако наилучшим способом решения этой проблемы было бы создание метода, возвращающего представление:

func nextView(for containedView: YourViewEnum) -> some View {
    switch containedView {
        case .home: return HomeView()
        case .categories: return CategoriesView()
        ...
    }
}

var body: some View {
    nextView(for: containedView)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...