小编Ric*_*oon的帖子

由于 NavigationLink,SwiftUI onAppear 被多次调用

在导航链接内时,SwiftUI onAppear 被多次调用。在我提供的示例中,它被调用了 5 次。这也会触发它的 StateObject 初始值设定项也被调用 5 次。如果您注释掉导航链接,它会按预期执行。

这已经在 Xcode 12 GM 和 Xcode 12.2 以及 iOS 14 GM 和 iOS 14.2 beta 1 上进行了测试。也作为反馈 FB8721761 提交。

struct ContentView: View {
    var body: some View {
        NavigationLink(destination: Color.red, label: {
            ImageView()
                .frame(width: 166.66, height: 250)
                .cornerRadius(10)
        })
    }
}

struct ImageView: View{
    @StateObject private var downloader = Downloaded(url: URL(string: "https://image.tmdb.org/t/p/w342/TnOeov4w0sTtV2gqICqIxVi74V.jpg")!)

    var body: some View{
        Rectangle()
            .onAppear{
                print("Appeared")
            }
    }
}

class Downloaded: ObservableObject{
    var cancellable: AnyCancellable?
    let url: URL …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

SwiftUI 键盘快捷键在工具栏或菜单中不起作用

当按钮位于 Menu 中时,SwiftUI 键盘快捷键似乎根本不起作用,并且它们仅适用于某些 ToolbarItem Placements,例如 bottomBar。

我已经把这个演示应用程序放在一起来显示当前的行为。

不幸的是,我认为这是一个 SwiftUI 错误,但任何人都可以想出一种方法来让这些工作,尤其是菜单中的按钮。

这是使用 Xcode 12.2 和 iOS 14.2 测试的。

反馈号:FB8895536

struct ContentView: View{
    @State private var tabSelection = Tab.navigationBarItemTest

    
    enum Tab {
        case navigationBarItemTest
        case navigationBarMenuTest
        case toolbarItemTest
        case ToolbarItemMenuTest
    }

    
    var body: some View{
        TabView(selection: $tabSelection) {
            NavigationBarItemTest()
                .tabItem {
                    Label("Nav Bar", systemImage: "1.circle")
                }
                .tag(Tab.navigationBarItemTest)
            
            NavigationBarMenuTest()
                .tabItem {
                    Label("Nav Bar Menu", systemImage: "2.circle")
                }
                .tag(Tab.navigationBarMenuTest)
            
            ToolbarItemTest()
                .tabItem {
                    Label("Toolbar Bar", systemImage: "3.circle")
                }
                .tag(Tab.toolbarItemTest)
            
            ToolbarItemMenuTest()
                .tabItem {
                    Label("Toolbar Bar …
Run Code Online (Sandbox Code Playgroud)

keyboard-shortcuts swift

5
推荐指数
0
解决办法
362
查看次数

SwiftUI 侧边栏不记得屏幕

我遇到一个问题,当我关闭应用程序以将其发送到后台然后重新打开它时,它不会转到最后一个屏幕。相反,它似乎会重置,就像应用程序从头开始打开一样。

\n

我在下面举了一个例子。在 iPad 上以横向模式运行它,选择“收藏夹”。详细信息控制器将显示红色屏幕。关闭应用程序以将其发送到后台,打开任何其他应用程序,然后返回到测试应用程序。您会看到它重置为绿色视图。它应该停留在红色视图上。

\n

我直接从 Fruta 示例项目中获取了所有代码,该项目没有这种行为,所以我不知道发生了什么。

\n

编辑

\n

我已经像 Asperi 建议的那样将 SideBar 设为独立列表,并且我现在也按照 Apple 的建议使用 SceneStorage。使用 SceneStorage 首先解决了侧边栏问题,但当我深入导航堆栈的多个级别时,核心问题仍然存在。

\n

在此更新的示例中,如果您点击侧边栏中的 Numbers,然后选择一行,离开应用程序,并在执行其他操作后返回,侧边栏选择将重置。

\n

我发现只有当您的应用程序支持多个窗口时这才是问题。如果您取消选中该框,则所有这些似乎都没有必要。

\n

下面的示例包含最新的代码编辑。

\n

编辑

\n

我联系了 Apple 代码级支持,他们重新扣款了我的帐户,告诉我我的问题可能是一个错误,并建议我提交雷达报告。我\xe2\x80\x99m 并不完全确定它\xe2\x80\x99 是一个框架错误。

\n
struct ContentView: View {\n    #if os(iOS)\n    @Environment(\\.horizontalSizeClass) private var horizontalSizeClass\n    #endif\n    \n    var body: some View {\n        #if os(iOS)\n        if horizontalSizeClass == .compact {\n            AppTabNavigation()\n        } else {\n            AppSidebarNavigation()\n        }\n        #else\n        AppSidebarNavigation()\n        #endif\n    }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n    static var previews: some View …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

Mac 上 CollectionView 单元格中的 UITextView 使 CPU 峰值

我有一个简单的 UIKit 应用程序,它有一个UITextView一个UICollectionViewCell. 该应用程序专为 iOS/iPadOS 设计,在这些平台上运行良好。然而,当我在 Mac(专为 iPad 设计)上运行时,一旦我开始滚动 CollectionView,CPU 使用率就会飙升至约 85%,并无限期地保持在该水平。降低 cpu 的唯一方法是在应用程序窗口之外单击,但一旦再次到达前台,cpu 使用率就会立即跳回原来位置。我也尝试过在 Mac 上以 Catalyst 模式运行,但 CPU 使用率稍低(约 45%)时也会出现同样的问题。

\n

此外,调试器不断地吐出[API] cannot add handler to 3 from 3 - dropping

\n

有人对此有解释或解决方案吗?

\n

I\xe2\x80\x99m 在 macOS Ventura 13.0 (22A380) 上使用 Xcode 版本 14.1 (14B47b)。

\n
class ViewController: UIViewController {\n    var dataSource: UICollectionViewDiffableDataSource<Section, String>! = nil\n    var collectionView: UICollectionView! = nil\n    var items = Array(0...100).map{"Item \\($0)"}\n    \n    enum Section: String {\n        case …
Run Code Online (Sandbox Code Playgroud)

macos uitextview uicollectionview

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

链接 swift 合并发布者并接收每个结果

在下面的示例中,我发出一个网络请求来加载不同的电影类型,然后使用它来加载所有电影。接收器只返回电影结果。我怎样才能同时接收流派和电影?

struct Genre: Codable, Identifiable{
    let id: Int
    let name: String
    var movies: [Movie]?
}

struct Movie: Codable, Hashable, Identifiable {
    let title: String
    let id: Int
    let posterPath: String?
    let backdropPath : String?
    var tagline: String?
}

loadGenres() is AnyPublisher<[Genre], Error> 
fetchMoviesIn() is AnyPublisher<[Movie], Error>

class GenresViewModel: ObservableObject{
    @Published var genres = [Genre]()
    @Published var movies = [Movie]()
    var requests = Set<AnyCancellable>()
    
    init(){
        NetworkManager.shared.loadGenres()
            .flatMap{ genres in
                genres.publisher.flatMap{ genre in
                    NetworkManager.shared.fetchMoviesIn(genre)
                }
            }
            .collect()
            .retry(1)
            .receive(on: DispatchQueue.main)
            .sink(receiveCompletion: { …
Run Code Online (Sandbox Code Playgroud)

swift combine

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