小编nic*_*rno的帖子

SwiftUI NavigationView 试图弹出到丢失的目的地(Monoceros?)

我正在使用 Xcode 12 进行 iOS 14.0 的部署。

  • 我的主屏幕有一个 NavigationView
  • 在 NavigationView 中有一个 TabView(有 4 个选项卡)
  • 每个选项卡中都有包含按钮和导航链接的子视图

应用程序上的导航功能正常(当我单击其中一个子视图上的 NavigationLink 时,它导航到正确的视图,当我单击后退按钮时,它会关闭视图。)但是,当我单击后退按钮时,控制台打印以下错误:

Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-103/Shared/NavigationBridge_PhoneTV.swift:337
Run Code Online (Sandbox Code Playgroud)

除了错误日志之外,该应用程序运行良好,所以我打算暂时忽略该错误......但我想知道它意味着什么?我的代码中没有任何名为“Monoceros”的内容。我猜这与 TabView 作为 NavigationView 的子视图有关?

编辑:

几个月后,这个问题仍然存在。这是可重现的代码。打开 ContentView(),在 FirstScreen() 上单击 NavigationLink,然后单击后退按钮。它会打印出 Monoceros 哈哈

Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-103/Shared/NavigationBridge_PhoneTV.swift:337
Run Code Online (Sandbox Code Playgroud)

xcode swift navigationview swiftui swiftui-navigationlink

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

使用可选的初始化程序将自定义数据类型存储在 @AppStorage 中?

我正在尝试将自定义数据类型存储到AppStorage. 为此,模型符合RawRepresentable(遵循本教程)。它工作正常,但是当我初始化@AppStorage变量时,它需要一个初始UserModel值。我想让该变量可选,因此如果用户注销,它可以为零。这可能吗?

在类/视图中,我可以这样初始化:

@AppStorage("user_model") private(set) var user: UserModel = UserModel(id: "", name: "", email: "")
Run Code Online (Sandbox Code Playgroud)

但我想这样初始化:

@AppStorage("user_model") private(set) var user: UserModel?
Run Code Online (Sandbox Code Playgroud)

模型:

struct UserModel: Codable {
        
    let id: String
    let name: String
    let email: String
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case email
    }
    
    init(from decoder: Decoder) throws {        
        let values = try decoder.container(keyedBy: CodingKeys.self)
        
        do {
           id = try String(values.decode(Int.self, forKey: .id))
        } catch DecodingError.typeMismatch { …
Run Code Online (Sandbox Code Playgroud)

nsuserdefaults swift swiftui

11
推荐指数
2
解决办法
4011
查看次数

SWIFT:加快视频下载速度的技巧?

我有一个 iOS 应用程序,可以从 Firebase (Cloud Firestore) 下载视频,其提要类似于 Instagram/TikTok。但是,在用户滚动到视频之前,我无法让视频随时可用。任何提示都会非常有帮助。抖音是如何做到的?他们是否会在加载时将一大堆视频保存到后台文件中?

我当前的视频下载管理器:

  1. 检查视频是否已加载到临时缓存或本地文件中,如果没有:
  2. 下载视频url(查看Firebase的downloadURL)
  3. 返回视频 url 以供立即使用(在播放之前仍然有一些缓冲延迟)
  4. 将视频 URL 存储在临时缓存中(以防用户滚动离开并返回)
  5. 开始将视频写入文件并在完成后从临时缓存中删除视频

在当前设置下,视频下载后可以高效播放。但是,如果视频尚未下载并且用户滚动到该视频,则上面的 (#1/2) 需要很长时间才能完成并缓冲足够的播放时间。我已经在使用操作队列并将当前视频优先于任何其他背景视频 - 但这仍然不够快。

当用户滚动时,TikTok 视频几乎总是随时可用。有什么秘密?

感谢您的帮助!

video ios firebase swift firebase-storage

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

滑动以仅删除 SwiftUI 列表中的选定行?

下面是 SwiftUI 列表的基本代码,它允许在所有行上使用滑动删除功能。是否可以将其限制为特定的行/索引?(即只允许第三行上的滑动删除行为,但在所有其他行上禁用它?)

在我的应用程序中,我有一个评论列表,我希望用户能够滑动删除自己的评论,但应该在所有其他评论上禁用滑动删除行为。我知道在 UIKit 中使用 UITableView 委托之一是可能的,但我不确定如何在 SwiftUI 中实现它。

struct ListTest: View {
    var body: some View {
        List {
            ForEach(0..<50) { index in
                Text("index is \(index)")
            }
            .onDelete(perform: { indexSet in
                print(indexSet)
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

xcode swift swiftui swiftui-list

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

Swift:使用 AVAssetExportSession() 连续合并视频

我有一组存储为 AVURLAsset 的视频录制,我想将视频合并到 1 个剪辑中,以便它们连续播放,视频之间没有时间间隔。下面是我希望做的,但它只显示第一个视频。注意:我希望视频连续播放,并且每个视频之间没有空白。例如,如果当手机未录音时,录音 1 和录音 2 之间存在实时时间,则输出不应显示此情况。

感谢您的帮助!

func mergeVideos(handler: @escaping (_ asset: AVAssetExportSession)->()) {
    let mixComposition = AVMutableComposition()
    var videoTime = CMTime.zero
    for video in self.recordings {

        let tracks = video.tracks(withMediaType: .video)
        let videoTrack = tracks[0]
        let videoTimeRange = CMTimeRangeMake(start: .zero, duration: video.duration)
        guard let compositionVideoTrack: AVMutableCompositionTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { return }
        do {
            try compositionVideoTrack.insertTimeRange(videoTimeRange, of: videoTrack, at: videoTime)
            videoTime = CMTimeAdd(videoTime, video.duration)
        } catch {
            print("An error occurred")
            return
        }
    } …
Run Code Online (Sandbox Code Playgroud)

xcode video-processing avassetwriter avassetexportsession swift

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

SwiftUI:如何实现用户滑动分页?(以前使用过 UICollectionView -&gt; 启用分页)

背景:我正在将一个项目从 UIKit 转换为 SwiftUI。目前使用 UIKit,我在 UICollectionView 中有一个 UICollectionView,两者都启用了分页。这允许用户在单元格上向上/向下和向左/向右滑动。每个单元格都会填充整个屏幕(类似于 TikTok 的主 UI),并且每个单元格都有大量要从 Firebase 中提取的数据,因此我不想在第一个视图出现时加载所有项目,而是在每个单元格出现时加载所有项目(这是 UIKit 下通过 UICollectionView 委托的当前实现)。

问题:我找不到在 SwiftUI 中启用此“分页”(基于用户滑动)的方法。很难想象苹果制作的这个新框架没有 Paging 功能?如果他们没有包含此内容,是否有解决方法?否则,是否有一种简单的方法将 UICollectionView 包含到 SwiftUIView 中?

任何帮助或解决方法都会很好!谢谢 :)

listview ios uicollectionview swift swiftui

5
推荐指数
2
解决办法
8188
查看次数

为什么在 TabView 中多次调用 makeUIView?

我的应用程序有一个 TabView (PageTabViewStyle),每个选项卡内都有一个 UIViewRepresentable。我已经简化了代码以生成下面的最小可重现示例。问题是 makeUIView 在出现时被多次调用,在浏览页面时又被多次调用。

仅供参考,这在 iOS 14.0 中不是问题,但在 iOS 14.2 中正在发生。我目前正在使用 Xcode 12.2 Release Candidate。

import SwiftUI

struct MakeUIViewTest: View {
    var body: some View {
        TabView {
            CustomViewRepresentable(color: .red, index: 0)
            CustomViewRepresentable(color: .blue, index: 1)
            CustomViewRepresentable(color: .gray, index: 2)
        }
        .tabViewStyle(PageTabViewStyle())
    }
}

struct MakeUIViewTest_Previews: PreviewProvider {
    static var previews: some View {
        MakeUIViewTest()
    }
}

struct CustomViewRepresentable: UIViewRepresentable {
    
    var color: UIColor
    var index: Int
            
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
    
    func makeUIView(context: Context) …
Run Code Online (Sandbox Code Playgroud)

xcode swift swiftui ios14 swiftui-tabview

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