标签: swiftui-state

用于自定义视图的 SwiftUI ViewModifier

有没有办法创建修改器来更新@State private var正在修改的视图中的a ?

我有一个自定义视图,它返回Text带有“动态”背景颜色的 a 或Circle带有“动态”前景色的 a。

struct ChildView: View {
    var theText = ""
    
    @State private var color = Color(.purple)
    
    var body: some View {
        HStack {
            if theText.isEmpty {          // If there's no theText, a Circle is created
                Circle()
                    .foregroundColor(color)
                    .frame(width: 100, height: 100)
            } else {                      // If theText is provided, a Text is created
                Text(theText)
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 25.0)
                                    .foregroundColor(color))
                    .foregroundColor(.white)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序的不同部分重复使用这个视图。如您所见,我需要指定的唯一参数是theText. 因此,创建此 ChildView …

swiftui viewmodifier swiftui-state

7
推荐指数
1
解决办法
1225
查看次数

SwiftUI 状态变量未更新

我有一个 struct User ,其爱好列表如下:

struct User: Hashable, Codable, Identifiable, Equatable {
    var id: String
    var name: String
    var hobbies: [String]
}
Run Code Online (Sandbox Code Playgroud)

然后,我使用用户列表作为状态变量生成列表视图。单击列表视图中的按钮时,新的爱好将添加到用户的爱好中。

struct UsersListView: View {

    @State var users: [User]


    var body: some View {

                TitleView(titleText: "Friends")
                    .padding(.leading, 30.0)

                List(userDisplayList) { user in
                     Text(user.name)
                     Text(user.hobbies.joined(separator: ", "))
                     Button(action: {self.users[0].hobbies.append("new hobby")}
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我单击按钮时,用户状态变量不会更改并保持不变。谁能解释一下这是怎么回事?

ios swift swiftui swiftui-list swiftui-state

6
推荐指数
1
解决办法
3732
查看次数

UIViewController 中嵌入的 UIHostingController - 如何从外部更新 @State?

我正在使用 aUIHostingController嵌入ContentView其中ViewController。我想在按下“更改名称”按钮时更改 的ContentView名称。name这是我的代码:

class ViewController: UIViewController {

    var contentView: ContentView? /// keep reference to ContentView
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.secondarySystemBackground
        
        /// add the button
        let button = UIButton()
        button.frame = CGRect(x: 50, y: 50, width: 200, height: 100)
        button.setTitle("Change name", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        button.addTarget(self, action: #selector(handleTap), for: .touchUpInside)
        view.addSubview(button)
        
        /// add the SwiftUI ContentView
        let contentView = ContentView()
        let hostingController = UIHostingController(rootView: contentView)
        self.contentView = …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-state

6
推荐指数
1
解决办法
3020
查看次数

即使列表已正确更新,为什么上下文菜单仍显示旧状态?

我面临的问题是,Context Menu尽管List下面显示的是正确的数据,但显示的数据却是错误的。问题是,一旦触发第一个项目的上下文菜单上的操作,您将看到如何重新List渲染并显示正确的数据,但如果您再次触发第一个项目的上下文菜单,它将不会显示正确的状态。如果您打开第二个项目的上下文菜单,它将显示正确的状态,但如果您现在选择“Two”,并打开相同的上下文菜单,则会State出现错误(当它应该显示时,它将仅显示 1 个选定的项目) 1 和 2,就像List显示的那样)。

感觉好像偏离了一个(就像呈现以前的状态而不是最新的状态),我不确定这是否只是一个错误或者我使用错误。

这是重现该问题的代码片段:

@main
struct ContextMenuBugApp: App {
    
    let availableItems = ["One", "Two", "Three", "Four", "Five"]
    @State var selectedItems: [String] = []
    
    var body: some Scene {
        WindowGroup {
            List {
                ForEach(availableItems, id: \.self) { item in
                    HStack {
                        let isAlreadySelected = selectedItems.contains(item)
                        Text("Row \(item), selected: \(isAlreadySelected ? "true" : "false")")
                    }.contextMenu {
                        ForEach(availableItems, id: \.self) { item in
                            let isAlreadySelected = selectedItems.contains(item)
                            Button …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-list swiftui-state

6
推荐指数
1
解决办法
1754
查看次数

SwiftUI 井字游戏板

我对 SwiftUI 非常陌生,我正在为我的班级开发井字游戏板。我在 Medium 上关注这篇文章,但遇到了一个问题。

当您玩游戏时,方块不会激活。直到游戏结束,您才能看到移动的位置。我不明白为什么会发生这种情况或如何解决它。任何帮助将非常感激!

import SwiftUI
import Combine

enum SquareStatus {
    case empty
    case visitor
    case home
}

class Square: ObservableObject {
    let didChange = PassthroughSubject<Void, Never>()

    var status: SquareStatus {
        didSet {
            didChange.send(())
        }
    }

    init(status: SquareStatus) {
        self.status = status
    }
}

class ModelBoard {
    var squares = [Square]()
    init() {
        for _ in 0...8 {
            squares.append(Square(status: .empty))
        }
    }
    func resetGame() {
        for i in 0...8 {
            squares[i].status = .empty
        }
    }
    var …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-state

5
推荐指数
1
解决办法
243
查看次数

SwiftUI:检测@State变量的@Binding何时发生变化

我试图弄清楚如何改变不同的值View。这是我的主要视图的实现:

import SwiftUI
import Combine

struct ContentView: View {
    @State private var isPresented: Bool = false
    
    @State private var textToProces = "" {
        didSet{
            print("text: oldValue=\(oldValue) newValue=\(textToProces)")

        }
    }
    var body: some View {
       
        ZStack{
            VStack{
                Button("Show Alert"){
                    self.isPresented = true
                }.background(Color.blue)
            }
            ItemsAlertView(isShown: $isPresented, textToProcess: $textToProces)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个视图中,我试图更改textToProces变量:

struct AnotherView: View {
    
    @Binding var isShown: Bool
    @Binding var textToProcess: String

    var title: String = "Add Item"
    let screenSize = UIScreen.main.bounds
    
    var body: some …
Run Code Online (Sandbox Code Playgroud)

ios swiftui swiftui-state xcode12

3
推荐指数
1
解决办法
3773
查看次数

Swift UI @State 确实在第一次点击时设置

我有一个自定义视图的简单列表。需要发生的是,当选择其中一项时,它需要显示该项目的详细视图。在我的代码中,当我第一次选择一个项目时,@Statet selectedListener 不会被设置,因此详细视图不会出现。如果我继续选择先前选择的相同项目,则行为保持不变。但是,如果我选择不同的项目,它会正常工作,并且我可以返回上一个项目并查看其详细视图,而不会出现问题。这是一件非常简单的事情,我正在尝试做,只是无法弄清楚我可能做错了什么。任何帮助,将不胜感激。谢谢。

struct ListenersListView<Model>: View where Model: ActiveListenerViewModel {

@ObservedObject var viewModel: Model
@State var showDetail = false
@State var selectedListener: UserProfile? = nil

var body: some View {
    ScrollView {
        VStack(spacing:20) {
            ForEach(viewModel.allActiveListeners) { listener in
                UserImageSection(listener: listener,
                                 subtext: listener.supportAreas)
                    .onTapGesture(perform: {
                        handleTap(listener)
                    })
            }
        }
        
    }
    .padding(.horizontal,20)
    .sheet(isPresented: $showDetail, content: {
        if let listener = selectedListener {
            ListenerDetailView(listener: listener)
        }
        else {
            // It should never come here but when the first item is selected it does. …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-state swiftui-ontapgesture

0
推荐指数
1
解决办法
936
查看次数