#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 вам почти всегда лучше позволить системе адаптировать ваш макет, а не использовать процедурный код для вычисления размеров