Невозможно изменить значение CGFloat в представлении

#ios #swiftui

#iOS #swiftui

Вопрос:

Я новичок в SwiftUI, и я не понимаю, что я здесь делаю неправильно, но я не могу изменить CGFloat variable .

Можете ли вы определить, что я здесь делаю не так?

 struct SomeView: View {

    
    @State private var someWidth: CGFloat
    @State private var someHeight: CGFloat

    var body: some View {
        Color.white
    
        /**
            Here the compiler throws an error:
        
            Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
        */
        self.someWidth = UIScreen.width

        
        Text("some Text")
            .frame(width: self.xwidth)
    }

}
 

width Переменная не устанавливается напрямую таким образом, она проходит некоторые проверки и может измениться соответствующим образом.
(в противном случае я мог бы просто установить значение UIScreen.width в Text кадр)

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

1. Когда вы хотите его изменить? Вы можете попытаться использовать onAppear , но все зависит от вашей цели.

2. Я обновил вопрос. Это что-то около этой реализации.

Ответ №1:

Код SwiftUI часто использует «неявный возврат», то Color.white есть на самом деле return Color.white . Вы можете понять, почему ваш код назначения после возврата не имеет смысла. Даже если оно скомпилировано, оно не будет выполнено.

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

 var body: some View {
   self.someWidth = UIScreen.width
   return Color.white   
}
 

Это скомпилирует, но выдаст вам предупреждение во время выполнения о том, что вы изменяете состояние при рендеринге представления.

Вы можете выполнить код перед отображением представления с помощью .onAppear :

 var body: some View {
   ZStack {
       Color.white
   }.onAppear { self.someWidth = UIScreen.width }   
}
 

Вы не объяснили, что вы на самом деле пытаетесь сделать, но вы можете захотеть посмотреть GeometryReader , а не использовать UIScreen , или, возможно, ввести ширину из super view через параметр.

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

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

2. Да, с SwiftUI вам почти всегда лучше позволить системе адаптировать ваш макет, а не использовать процедурный код для вычисления размеров