Кнопка, возвращенная из функции, не работает при нажатии в SwiftUI

#swift #xcode #foreach #swiftui #return-type

#быстрый #xcode #foreach #свифтуи #возвращаемый тип

Вопрос:

итак, у меня есть цикл ForEach в моем contentView, который вызывает функцию makeButton() несколько раз. Эта функция возвращает кнопку, но по какой-то причине кнопка ничего не делает, когда вы нажимаете на нее (иначе говоря, «действие» не выполняется). Я подумал, может быть, это как-то связано с типом возвращаемого значения, но я действительно не уверен, что здесь происходит:

 ForEach(array, id: .self) { (client: Client) in
    self.makeButton(client: client)
}
 

и тогда сама функция выглядит так:

 func makeButton(client: SocketClient) -> some View {  
    //calculations for horizontal and vertical offset here
    return Button(action: {
        print("Clicked a button and it should print out (client.colorVariable)")
    }, label: {
        ZStack {
            Circle()
                .fill(client.colorVariable)
        }.frame(width: 30, height: 30)
        .offset(x: horizontalOffset, y: verticalOffset)
    })
}
 

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

1. Что произойдет, если вы сделаете кнопку своей собственной структурой вместо функции? ie struct ClientButton: View { let client: Client; var body: some View { ... }}

2. @CenkBilgen Для простоты я удалил некоторые вещи, но, по сути, функция выполняет кучу вычислений с использованием переменных, найденных в «клиенте». Единственный способ, которым я мог придумать, чтобы сделать это в пользовательской структуре, был бы в init, но это может быть очень неаккуратно — верно?

3. @CenkBilgen Ладно, неважно — я просто реализовал это очень быстро, и даже это не работает. в моем теле я просто объявил все константы, выполнил вычисления и прочее, а затем вернул кнопку … все еще не работает. Дайте мне знать, если хотите, чтобы я опубликовал, как это выглядит.

4. Хм, другая вещь, возможно, область нажатия кнопки. Попробуйте самый простой пример, просто обычный текст вместо ZStack. Затем вы можете настроить область нажатия кнопки с .contentShape(...) помощью, хотя, похоже, вам это не нужно, потому что вы устанавливаете рамку.

5. Итак, я вроде как нашел проблему. Я обновлю свой код до. У меня есть смещение по кругу, и это приводит к тому, что точка обнаружения кнопки остается в центре экрана, пока круг перемещается… есть идеи, как это исправить?