【问题标题】:Conditionals, Variables, and Views条件、变量和视图
【发布时间】:2022-10-15 17:48:04
【问题描述】:

Swift 新手,无法找到解决方案。这可能是一个简单的修复,我无法弄清楚。

该程序在 TextField 中获取用户输入并根据该输入做出反应(如果输入是数字,或者不是数字,以及输入的字符数)。

我试图弄清楚如何重新分配变量像素在条件语句中以改变字体大小。

下面的代码:

import SwiftUI

struct ContentView: View {
    
    @State var p: String = ""
    @State var px: Int = 35
    
    
    var body: some View {
        VStack(spacing: 0.0) {
            if p.isNotNum {
                if p.count > 10 {
                    px = 20 \\ this breaks
                }
                Text(String(p))
                    .font(.system(size: CGFloat(px)))
            } else if p.isNum {
                if p.count > 10 {
                    px = 20 \\ this breaks
                }
                Text(String(p))
            }
            TextField("P", text: $p)
        }
    }
}

extension String {
    var isNum: Bool {
        return Double(self) != nil
    }
}

extension String {
    var isNotNum: Bool {
        return Double(self) == nil
    }
}

【问题讨论】:

  • “这破”怎么破?
  • 此外,对于特定条件有一个布尔属性是很奇怪的,它恰恰相反。更奇怪的是先检查第一个,然后再检查它的反面(如果p.isNotNum 是假的,那么p.isNum 肯定是真的,你不需要检查)。考虑简化为if p.isNum { ... } else { ... }
  • 您不能在视图中的任何位置使用这种类型的代码px = 20,它只允许在某些地方使用。我建议你阅读 SwiftUI 的基础知识:developer.apple.com/tutorials/swiftui 来理解这个基本概念。请注意,您的代码logic 远低于平均水平。
  • 首先关注这个不错的免费在线课程cs193p.sites.stanford.edu
  • 确实有些地方很奇怪,这是对需要这些检查的更大代码库的解释

标签: swift swiftui


【解决方案1】:

body 属性是一个 view builder 并且系统通过调用这个 get {} 属性来获取新的视图作为依赖项的变化(这里是 @State )。

如果您想根据 @State property change 进行一些更改,使用 .onChange 很明显。

struct ContentView: View {
    
    @State var p: String = ""
    @State var px: Int = 35
    
    
    var body: some View {
        VStack(spacing: 0.0) {
            if p.isNum {
                Text(String(p))
                    
            } else  {
                Text(String(p))
                    .font(.system(size: CGFloat(px)))
            }
            TextField("placeholder p ", text: $p)
        }
        .onChange(of: p, perform: { // <= here
            if $0.count > 10 {
                px = 20
            } else if p.count > 10 {
                px = 20
            }
        })
    }
}

【讨论】:

    【解决方案2】:

    您不能在视图层次结构的中间使用像 px = 20 这样的命令式代码,因为它不会返回 View

    请改用onChange

    .onChange(p) {
        if $0.count > 10 {
            px = 20
        } else if p.count > 10 {
            px = 20
        }
    }
    

    此外,您可以通过分配一个常量来执行some View 中的代码。例如:

    let _ = { px = 20 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多