当我从向下推 2+ 层的视图中的数组更新绑定属性时,导航会在属性更改后立即弹出。
Xcode 13.3 测试版、iOS 15。
我创建了一个简单的演示,代码如下。
更新列表标题(一个视图深)就可以了,导航堆栈保持不变,如果我返回,更改就会发布。但是,当调整部分标题(两层深)时,只要我对属性进行一次更改,导航就会弹出。
我有一种感觉,我在这里缺少基本的基础知识,而且我有一种感觉,它一定与列表有关id?但我正在努力弄清楚或解决它。
动图
楷模:
struct ShoppingList {
let id: String = UUID().uuidString
var title: String
var sections: [ShoppingListSection]
}
struct ShoppingListSection {
let id: String = UUID().uuidString
var title: String
}
Run Code Online (Sandbox Code Playgroud)
查看型号:
final class ShoppingListsViewModel: ObservableObject {
@Published var shoppingLists: [ShoppingList] = [
.init(
title: "Shopping List 01",
sections: [
.init(title: "Fresh food")
]
)
]
}
Run Code Online (Sandbox Code Playgroud)
内容查看:
struct ContentView: View {
var body: some View …Run Code Online (Sandbox Code Playgroud) 接收错误:
SwiftUI/NavigationColumnState.swift:520: Fatal error: 'try!' expression unexpectedly raised an error: SwiftUI.AnyNavigationPath.Error.comparisonTypeMismatch`
Run Code Online (Sandbox Code Playgroud)
当 NavigationSplitView 的详细信息视图发生更改,并且移动的详细信息视图具有NavigationStack(path: ...).
这看起来像是一个错误,尽管通常当我认为我做了一些愚蠢的事情时。如果有人能弄清楚的话,我很想知道解决方法或修复方法。
Xcode:版本 14.3 (14E222b) 模拟器: iPad Air(第 5 代)/My Mac(专为 iPad 设计)
楷模
SwiftUI/NavigationColumnState.swift:520: Fatal error: 'try!' expression unexpectedly raised an error: SwiftUI.AnyNavigationPath.Error.comparisonTypeMismatch`
Run Code Online (Sandbox Code Playgroud)
应用程序.swift
import SwiftUI
final class AppModel: ObservableObject {
@Published var appNavigation: AppNavigation? = .lists
@Published var listsNavigation: [ListsNavigation] = []
@Published var settingsNavigation: [SettingsNavigation] = []
}
enum AppNavigation {
case lists, settings
}
enum SettingsNavigation {
case settings1, …Run Code Online (Sandbox Code Playgroud) 我试图在一个简单的测验(例如示例)中将逻辑与用户界面分开。但当我回答完问题后,我正在努力思考如何离开。
在 Xcode 12 中我收到错误:
访问安装在视图之外的状态值。这将导致 Binding 的初始值恒定并且不会更新。
我从其他答案中看到@State只能在struct中使用,建议发布。但我似乎无法弄清楚如何使用已发布的属性与其绑定而不是“安装在视图上”
class ViewModel: ObservableObject {
@Published var currentQuestion: String!
private var questions = ["one", "two", "three"]
private var index = 0
init() {
currentQuestion = questions[index]
}
func button(title: String) -> some View {
Button(action: { [self] in
if index < questions.count {
index += 1
currentQuestion = questions[index]
} else {
print("go to results view")
}
}) {
Text(title)
}
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel() …Run Code Online (Sandbox Code Playgroud) 我在弄清楚如何构造 UISplitViewController 时遇到了很多麻烦。
我想:
我看到其他应用程序这样做(例如 GitHub),但我真的不知道他们是如何管理它的。资源很难找到,而且我见过的大多数教程都只显示一种或另一种列样式。
我主要是在寻找有关如何构建如此良好的架构的答案,但任何代码也将受到极大的赞赏!
场景委托
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window?.windowScene = windowScene
window?.rootViewController = ViewController(style: .tripleColumn)
window?.makeKeyAndVisible()
}
Run Code Online (Sandbox Code Playgroud)
根视图控制器
class ViewController: UISplitViewController {
override func viewDidLoad() {
super.viewDidLoad()
viewControllers = [
SidebarViewController(),
AnimalsViewController(),
AnimalDetailViewController()
]
// Example attempt at removing the secondary view
setViewController(ProfileViewController(), for: .supplementary)
setViewController(nil, for: .secondary)
hide(.secondary)
}
} …Run Code Online (Sandbox Code Playgroud) 我正在@AppStorage与String财产一起使用。更改属性值时,视图会自动更新以反映预期的更改。然而,大多数时候它并没有持续存在UserDefaults。我觉得自己错过了一些东西,这让我感觉很愚蠢。还有其他人看到这个吗?
脚步:
环境:
非常简单的例子:
struct ContentView: View {
@AppStorage("token") var token: String = ""
var body: some View {
Form {
Section("Token") {
Text(token)
}
Section("Debug") {
Button("Update 01") {
token = "token-01"
}
Button("Update 02") {
token = "token-02"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)