小编lac*_*her的帖子

在推送视图中修改列表绑定属性时,SwiftUI 导航会弹出

当我从向下推 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 swiftui-navigationlink swiftui-navigationview

12
推荐指数
1
解决办法
2704
查看次数

NavigationSplitView - SwiftUI.AnyNavigationPath.Error.comparisonTypeMismatch

接收错误:

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)

ios swift swiftui

8
推荐指数
1
解决办法
1468
查看次数

SwiftUI 绑定 bool 外部视图 - “访问安装在视图之外的状态值”

我试图在一个简单的测验(例如示例)中将逻辑与用户界面分开。但当我回答完问题后,我正在努力思考如何离开。

在 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)

swift swiftui

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

Swift UISplitViewController 如何从三列变为双列

我在弄清楚如何构造 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)

uikit ipad uisplitviewcontroller swift

4
推荐指数
1
解决办法
991
查看次数

SwiftUI @AppStorage 并不总是持久的价值

我正在@AppStorageString财产一起使用。更改属性值时,视图会自动更新以反映预期的更改。然而,大多数时候它并没有持续存在UserDefaults。我觉得自己错过了一些东西,这让我感觉很愚蠢。还有其他人看到这个吗?

脚步:

  • 启动应用程序
  • 改变值
  • 杀死并重新启动应用程序
  • 将值更改为其他值
  • 杀死并重新启动应用程序

环境:

  • Xcode 13.4 (13F17a)
  • iOS 15.5 - iPhone 13 Pro 模拟器

非常简单的例子:

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)

示例 gif

resolver ios swiftui appstorage

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