Сложная настраиваемая навигация SwiftUI - PullRequest
0 голосов
/ 10 апреля 2020

Вот мой текущий демонстрационный пользовательский интерфейс, написанный на SwiftUI:

enter image description here

Я хочу принимать пользовательские решения по навигации и отображать на основе, если ячейка (Просмотреть 1, Вид 2, ...) был нажат или если была нажата одна из кнопок (стрелок) в ячейке.

Например, каждая ячейка представляет отдельный вид, к которому я хочу перейти, и каждую кнопку со стрелкой представляет некоторый пользовательский модал, который я хочу представить.

Как отслеживать контекст и распространять различные касания до представления, которое в конечном итоге будет принимать решения о навигации. Вот представление, которое составляет список и будет принимать решения о навигации:

import SwiftUI

struct ContentView: View {

    @State var options: [String] = ["View 1", "View 2", "View 3", "View 4"]

    var body: some View {
        ZStack {
            Color.white.edgesIgnoringSafeArea(.all)
            ScrollView {
                ForEach(self.options, id: \.self) { element in
                    OptionCell(optionDescription: element)
                }
            }
        }
    }
}

А вот мой класс OptionCell. Я пытаюсь проиллюстрировать мою проблему в некоторых комментариях к действию кнопки здесь.

struct OptionCell {
    //MARK: Input Properties
    @State var optionDescription: String

    //MARK: Computed Properties

    //MARK: Init

    //MARK: Functions
    func cellTapped() {
        ///What can I call here to propagate the context of this cell along with the fact that it was tapped to something that needs to make UI transition decisions?
        print("\(self.optionDescription) Tapped")
        //What can I do to make micro navigation decisions if one of the "ArrowButtons" is tapped?
    }
}


extension OptionCell: View {
    var body: some View {
        Button(action: { self.cellTapped() }) {
            VStack {
                HStack{
                    Text(self.optionDescription).foregroundColor(Color.black).padding()
                    Spacer()
                    HStack {
                        //These Views have a Button view in them with a call to a function in that struct. How do I get the call for the tap on each of these buttons propagated up to the decisions making view?
                        ArrowButton(direction: .LEFT)
                        ArrowButton(direction: ArrowDirection.RIGHT)
                        ArrowButton(direction: ArrowDirection.DOWN)
                        ArrowButton(direction: ArrowDirection.UP)
                    }.padding()

                }
                ///Another custom view that I have
                SeparatorView(separatorViewStyle: SeparatorViewStyle.init(weight: .THIN, gapPosition: .RIGHT, color: Colors.grey.medium))
            }
        }
    }
}

В UIKit Я бы добавил действия кнопки к пользовательскому UITableViewCell, а затем создал делегат для пользовательской ячейки. Нажатие на кнопку вызовет соответствующую функцию делегата (Delegate.leftArrow (), Delegate.upArrow (), ...) и UIViewController станет делегатом для пользовательской ячейки и примет там навигационные решения.

1 Ответ

1 голос
/ 11 апреля 2020

Я предполагаю, что вопрос:

Как мне получить сигнал для нажатия на каждую из этих кнопок, передаваемых в представление принятия решений?

В ContentView вы настраиваете что-то вроде этого :

@ObservedObject var myChoice = MyChoiceClass()

где:

class MyChoiceClass: ObservableObject {
    @Published var choice: String = ""
}

передать его на вашу OptionCell (...) и затем на ArrowButton (...)

Так что когда кнопка со стрелкой (...) меняет «выбор», он отражается повсюду.

...