Список SwiftUI — выбранный элемент мигает белым, прежде чем будет нарисован, как планировалось

#swift #swiftui

#swift #swiftui

Вопрос:

У меня есть этот код для списка, заполненного основными данными:

       List {
          ForEach(items.filter {
            self.searchText.isEmpty ? true : $0.term!.contains(self.searchText)
          }, id: .self) { item in
            
            Button(action: {
              globalVariables.selectedItem = item                  
            }) {
              Text(item.term!)
                .font(fontItems)
                .disabled(true)
                .foregroundColor(globalVariables.selectedItem == item ? .black : .white)
            }
            .listRowBackground(
              Group {
                if ((globalVariables.selectedItem == nil) || (item != globalVariables.selectedItem)) {
                  Color(UIColor.clear)
                } else if item == globalVariables.selectedItem {
                  Color("corListaSelecao").mask(RoundedRectangle(cornerRadius: 20))
                }
              }
              .padding(EdgeInsets(top: 0, leading: 5, bottom: 0, trailing: 5))
            )
          }
          .onDelete(perform: deleteItems)
          .onAppear{
            globalVariables.selectedItem = items.first
          }
          .cornerRadius(20)
        }
        .background(Color("fundoControles"))
        .cornerRadius(10)
        .padding(EdgeInsets(top: 5, leading: 10, bottom: 5, trailing: 10))
  

В результате создается список, подобный следующему рисунку:

введите описание изображения здесь

Каждый раз, когда я выбираю новый элемент в списке, фон нового выбранного элемента на мгновение отображается в виде белого прямоугольника с жесткими краями, затем он рисуется так, как и должен быть, оранжевым с закругленными углами.

Я нигде не устанавливаю этот белый цвет.

У меня есть этот init в моем contentView:

 init() {
  UITextView.appearance().backgroundColor = .clear
  UITableView.appearance().backgroundColor = .clear
  UITableViewCell.appearance().backgroundColor = .clear
}
  

Откуда берется этот белый цвет?

Как мне избавиться от этой нежелательной вспышки?

Комментарии:

1. Вы нигде не меняли внешний вид UIKit?

2. да, но не до белого. Я добавил эту информацию к вопросу.

Ответ №1:

Это может быть выделение списка по умолчанию для Button , попробуйте удалить Button и использовать вместо .onTapGesture этого напрямую Text , например

   Text(item.term!)
    .font(fontItems)
    .disabled(true)
    .foregroundColor(globalVariables.selectedItem == item ? .black : .white)
 // replacements for button to make whole row tappable
    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
    .contentShape(Rectangle())
    .onTapGesture {
        globalVariables.selectedItem = item
    }
  

Комментарии:

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

2. Нет, попробуйте как добавлено … frame contentShape — они делают всю строку доступной для прослушивания. Это проверено — это работает.