Индикатор раскрытия списка SwiftUI без NavigationLink

Я ищу решение, чтобы показать шеврон индикатора раскрытия информации без необходимости заключать мое представление в NavigationLink. Например, я хочу показать индикатор, но не переходить к новому представлению, а вместо этого, например, показать модальное окно.

Я нашел много решений, которые скрывают кнопку индикатора, но ни одно из них не объясняет, как ее добавить. Возможно ли это в текущей версии SwiftUI?

struct MyList: View {
    var body: some View {
        NavigationView {
        List {
            Section {
                Text("Item 1")
                Text("Item 2")
                Text("Item 3")
                Text("Item 4")

            }
        }
    }
}

Например, я хочу добавить индикатор раскрытия в Item 1 без необходимости заключать его в NavigationLink

Я уже пытался подделать индикатор с помощью символа chevron.right SF, но этот символ не соответствует 100% стандартному символу iOS. Верхний - по умолчанию нижний - chevron.right.

Изображение кнопки раскрытия информации


person grahan    schedule 06.06.2020    source источник
comment
Это похоже: Image(systemName: "chevron.right").font(Font.system(.footnote).weight(.semibold))   -  person pawello2222    schedule 07.06.2020
comment
@ pawello2222 Большое спасибо, тоже выглядит так же, как оригинал. Теперь у меня есть два решения (у)   -  person grahan    schedule 07.06.2020


Ответы (3)


Надеюсь, это то, что вы ищете. Вы можете добавить элемент в HStack и с помощью разделителя между ними подделать его, что это ссылка:

HStack {
                    Text("Item 1")
                    Spacer()
                    Button(action: {

                    }){
                        Image(systemName: "chevron.right")
                            .font(.body)
                    }
                }
person Geart Otten    schedule 06.06.2020
comment
Большое спасибо за ответ! - Я уже сделал это, и, к сожалению, это не решило мою проблему на 100%, потому что chevron.right не соответствует внешнему виду индикатора раскрытия по умолчанию. Я должен был написать это в своем вопросе, извините за это - ›сейчас отредактировал свой вопрос. - person grahan; 07.06.2020
comment
Вы можете попробовать отредактировать шрифт до нужного стиля. Я подошел довольно близко, выполнив: .font (Font.system (размер: 13, вес: .semibold, дизайн: .default)) .foregroundColor (Color (красный: 0,771, зеленый: 0,771, синий: 0,779)) - person Geart Otten; 07.06.2020
comment
О, вы правы, я совершенно забыл, что могу таким образом модифицировать изображение. Так много вещей, которые нужно помнить в SwiftUI. Спасибо, действительно похоже на оригинал. Спасибо ! - person grahan; 07.06.2020
comment
Если вы используете цвет .foregroundColor(Color(UIColor.tertiaryLabel)), он также правильно поддерживает темный режим. - person Bart van Kuik; 17.11.2020

Это определенно возможно.

Вы можете использовать комбинацию Button и нефункционального NavigationLink для достижения желаемого.

Добавьте следующее расширение на NavigationLink.

extension NavigationLink where Label == EmptyView, Destination == EmptyView {

   /// Useful in cases where a `NavigationLink` is needed but there should not be
   /// a destination. e.g. for programmatic navigation.
   static var empty: NavigationLink {
       self.init(destination: EmptyView(), label: { EmptyView() })
   }
}

Затем в вашем List вы можете сделать что-то вроде этого для строки:

// ...
ForEach(section.items) { item in
    Button(action: {
        // your custom navigation / action goes here
    }) {
        HStack {
            Text(item.name)
            Spacer()
            NavigationLink.empty
        }
    }
 }
 // ...

Вышеупомянутое дает тот же результат, что и если бы вы использовали NavigationLink, а также выделяет / снимает выделение строки, как ожидалось, при взаимодействиях.

person George Marmaridis    schedule 31.03.2021

Или, может быть, создайте поддельный и используйте его, даже если вы нажмете, вы сможете вызывать свои события.

 NavigationLink(destination: EmptyView()) {
            HStack {
                Circle()
                 Text("TITLE")  
               
            }
        }
        .contentShape(Rectangle())
        .onTapGesture {
            print("ALERT MAYBE")
        }
person zdravko zdravkin    schedule 16.12.2020