Тернарный оператор внутри NavigationLink SwiftUI

Sep 27 2020

У меня проблема при попытке использовать тернарный оператор для кнопки в NavigationLink. У меня есть массив кампаний, который отображается в carouselView. Ниже карусели есть кнопка (NavigationLink) для открытия другого представления, в котором отображаются детали кампании. Массив кампаний изначально пуст, поэтому мне нужно проверить, если self.cardCampaigns> 0, если это правда, он должен перейти к представлению, которое отображает детали кампании, в противном случае игнорировать (я пытаюсь показать представление с текстом " Нет доступных кампаний ». Я использую для этого тернарный оператор, но он не работает. Я получаю« Значения результатов в выражении '?:' Имеют несовпадающие типы »CampaignDetailsView 'и« Текст », ошибка, в которой я использую тройной оператор.

Мой код ниже:

NavigationLink(destination:
    self.cardCampaigns.count > 0 ? CampaignDetailsView(viewModel: CampaignDetailsViewModel(campaign: cardCampaigns[self.count].campaign)) : Text("No Campaign found")
) {
    ZStack {
        RoundedRectangle(cornerRadius: 8)
            .foregroundColor(Color.orOrangeColor)
            .frame(width: 300, height: 50)
        Text("Details")
            .foregroundColor(.white)
    }
}

Ответы

3 pawello2222 Sep 27 2020 at 21:16

Это потому, что типы CampaignDetailsViewи Textне совпадают. Вы должны использовать @ViewBuilder(или просто Group, и VStackт.д.).

Вот решение с целевым представлением в качестве @ViewBuilderвычисляемого свойства:

@ViewBuilder
var destinationView: some View {
    if cardCampaigns.count > 0 {
        CampaignDetailsView(viewModel: CampaignDetailsViewModel(campaign: cardCampaigns[self.count].campaign))
    } else {
        Text("No Campaign found")
    }
}

Что вы можете использовать так:

NavigationLink(destination: destinationView) { ... }