在导航链接内时,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) 当按钮位于 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) 我遇到一个问题,当我关闭应用程序以将其发送到后台然后重新打开它时,它不会转到最后一个屏幕。相反,它似乎会重置,就像应用程序从头开始打开一样。
\n我在下面举了一个例子。在 iPad 上以横向模式运行它,选择“收藏夹”。详细信息控制器将显示红色屏幕。关闭应用程序以将其发送到后台,打开任何其他应用程序,然后返回到测试应用程序。您会看到它重置为绿色视图。它应该停留在红色视图上。
\n我直接从 Fruta 示例项目中获取了所有代码,该项目没有这种行为,所以我不知道发生了什么。
\n编辑
\n我已经像 Asperi 建议的那样将 SideBar 设为独立列表,并且我现在也按照 Apple 的建议使用 SceneStorage。使用 SceneStorage 首先解决了侧边栏问题,但当我深入导航堆栈的多个级别时,核心问题仍然存在。
\n在此更新的示例中,如果您点击侧边栏中的 Numbers,然后选择一行,离开应用程序,并在执行其他操作后返回,侧边栏选择将重置。
\n我发现只有当您的应用程序支持多个窗口时这才是问题。如果您取消选中该框,则所有这些似乎都没有必要。
\n下面的示例包含最新的代码编辑。
\n编辑
\n我联系了 Apple 代码级支持,他们重新扣款了我的帐户,告诉我我的问题可能是一个错误,并建议我提交雷达报告。我\xe2\x80\x99m 并不完全确定它\xe2\x80\x99 是一个框架错误。
\nstruct 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) 我有一个简单的 UIKit 应用程序,它有一个UITextView一个UICollectionViewCell. 该应用程序专为 iOS/iPadOS 设计,在这些平台上运行良好。然而,当我在 Mac(专为 iPad 设计)上运行时,一旦我开始滚动 CollectionView,CPU 使用率就会飙升至约 85%,并无限期地保持在该水平。降低 cpu 的唯一方法是在应用程序窗口之外单击,但一旦再次到达前台,cpu 使用率就会立即跳回原来位置。我也尝试过在 Mac 上以 Catalyst 模式运行,但 CPU 使用率稍低(约 45%)时也会出现同样的问题。
此外,调试器不断地吐出[API] cannot add handler to 3 from 3 - dropping。
有人对此有解释或解决方案吗?
\nI\xe2\x80\x99m 在 macOS Ventura 13.0 (22A380) 上使用 Xcode 版本 14.1 (14B47b)。
\nclass 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) 在下面的示例中,我发出一个网络请求来加载不同的电影类型,然后使用它来加载所有电影。接收器只返回电影结果。我怎样才能同时接收流派和电影?
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)