有没有办法创建修改器来更新@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 …
我有一个 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)
但是,当我单击按钮时,用户状态变量不会更改并保持不变。谁能解释一下这是怎么回事?
我正在使用 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) 我面临的问题是,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 非常陌生,我正在为我的班级开发井字游戏板。我在 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) 我试图弄清楚如何改变不同的值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) 我有一个自定义视图的简单列表。需要发生的是,当选择其中一项时,它需要显示该项目的详细视图。在我的代码中,当我第一次选择一个项目时,@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)