Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃
Posted
技术标签:
【中文标题】Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃【英文标题】:Xcode 11 beta 3 crashing when using NavigationLink, @EnvironmentObject and List together 【发布时间】:2019-07-03 13:52:18 【问题描述】:我在 SwiftUI / Xcode 11 beta 3 中遇到了一个奇怪的崩溃,代码如下所示(我只保留了最低限度来显示该行为):
import SwiftUI
import Combine
final class AppData: BindableObject
let didChange = PassthroughSubject<AppData, Never>()
init()
struct ContentView : View
var body: some View
NavigationView
NavigationLink(destination: DetailView() )
Text("link")
struct DetailView : View
@EnvironmentObject var appData: AppData
// @ObjectBinding var appData = AppData() -> Works
var body: some View
List
Text("A")
Text("B")
Text("C")
BindableObject
像这样被注入SceneDelegate.swift
:
....
// Use a UIHostingController as window root view controller
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView()
.environmentObject(AppData()))
self.window = window
window.makeKeyAndVisible()
....
当关注NavigationLink
时,它会因
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
如果我从详细视图中删除 List
视图,它可以正常工作。如果我改用 @ObjectBinding
也是一样的(就像在我的代码中的注释行中一样)。
以前的测试版中使用的代码相同。
【问题讨论】:
我遇到了同样类型的崩溃。这是来自控制台的部分错误消息:错误:模块导入失败:无效令牌(rlm_lldb.py,第 37 行)文件“temp.py”,第 1 行,在这是 Xcode 11 beta 3 中的一个错误。旧的行为可能会恢复。
截至 2019 年 7 月 4 日,来自https://developer.apple.com/tutorials/swiftui/handling-user-input:
第四步
在 Xcode 11 beta 3 中,LandmarkDetail 视图不会自动访问视图层次结构环境中的 UserData 对象。解决方法是将 environmentObject(_:) 修饰符添加到 LandmarkDetail 视图。
【讨论】:
【参考方案2】:我认为这是设计使然。创建 DetailView() 时,它与层次结构断开连接,因此不会继承相同的环境。
如果您将 ContentView 更改为以下内容,它不会崩溃。我想我记得有一个类似的模态问题:
struct ContentView : View
@EnvironmentObject var appData: AppData
var body: some View
NavigationView
NavigationLink(destination: DetailView().environmentObject(appData) )
Text("link")
【讨论】:
那么@EnvironmentObject
的目的是什么?如果我必须将它显式传递给我导航到的每个视图,为什么不使用普通参数(@binding 或不使用)?
好吧,不是 所有 视图。只有像 DetailView 和其他一些情况,对于大多数人来说,@EnvironmentObject 仍然可以发挥作用。
我想我们可以同意,在 DetailView 创建的时候,因为它没有父级,它不能继承一个环境。有争议的是 SwiftUI 是否应该在将环境插入(呈现)到层次结构中时自动附加环境。我认为它不应该,否则它可能会覆盖您可能设置的特定环境。我认为 SwiftUI 只是一个警告,如果你想让它继承环境,你必须自己做。这是我的意见,我没有在任何地方读过。
我明白你的意思,虽然我不同意 :-) 如果我想通过我的应用程序“手动”创建数据流,我会在视图的初始化程序中使用普通参数。环境应该随处可访问,就像在 beta 1 和 2 中所做的那样。
你确定它在 beta 1 和 2 中是这样工作的吗?我记得至少一周前遇到过这个问题。以上是关于Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 11 beta 3 上 UIAction 的语法
安装 Xcode 9.0 Beta 后 Xcode 8.3.2 中缺少模拟器
我升级到“Xcode 11 Beta 3”,它只引入“Create ML”(版本 1),没有显示“活动”分类器模型?
xcodebuild 在 Xcode 11 beta 上挂起,在 Xcode 10 上成功
使用 Alamofire Swift 3 和 Xcode 8 beta 解析 JSON 没有数据
未找到 SwiftUI 符号:_$s7SwiftUI9TextFieldVAA4ViewAAMc Xcode 11 beta 3