问题标签 [uiviewrepresentable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 在 swiftui 中评估 JavaScript
从 webview 收到消息时,如何让评估 JavaScript 工作?
print(message.body) <--- 这是有效的
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'", completionHandler: nil) <--- 这不是
ios - 在 onAppear 中更改状态会破坏 PageViewController
.onAppear
我很难理解为什么 PageViewController在其父视图中更改 @Published EnvironmentObject 变量时无法按预期工作。
如果我在 中注释掉.onAppear
修饰符DetailView
,那么一切正常 - 幻灯片按 PageViewController 的预期滑动。但是一旦该修饰符重新进入,页面就不会正确滑动。
由于状态变化,这与重新渲染有关,但我无法弄清楚。我知道这updateUIViewController
是在状态更改时调用的,这似乎会更改 viewControllers 的数组。
如果有人对如何解决这个问题有指导意见,我将非常感激听到它!
如果您正在运行以下代码,请确保更改您的 SceneDelegate:
至
所以这里有一个简单的问题示例:
swift - UIViewRepresentable 中的 updateUIView 内的绑定未立即更新
我正在使 Swift 项目适应 SwiftUI。原始项目对 UIImages 进行拖放、绘图和其他一些在 SwiftUI 中无法实现的操作。
下面的代码仅用于解释问题。工作代码: https ://github.com/rolisanchez/TestableDragAndDrop
在该项目中,当用户点击一个按钮时,a@State setChooseImage
变为 true,打开一张工作表,其中向他展示了一系列图像:
选择图像后,setChooseImage
设置回false,关闭工作表。图像self.chosenAssetImage
也是一个@State
并设置为所选图像。@State shouldAddImage
也设置为真。这个选择的 UIImage 和 Bool 在我创建的 UIView 中使用,以添加 UIImages。它在 SwiftUI 中是这样调用的:
添加 UIView 的 UIViewRepresentable 如下:
我知道
updateUIView
只要有一些可能影响视图的更改就会调用。在这种情况下,shouldAddImage
变为 true,从而正确进入if
循环并调用addNewAssetImage
,将图像插入 UIView。这里的问题是在更新绑定之前
updateUIView
被多次调用,并且一直进入if shouldAddImage
循环。shouldAddImage
这意味着它将多次将图像添加到 UIView。我在赋值之前和之后都放了一个断点
shouldAddImage = false
,甚至在通过那一行之后,值仍然是true
。我想要的行为是将
shouldAddImage
立即更改为false,这样即使updateUIView
被多次调用,它也只会进入循环一次,只添加一次图像。
ios - SwiftUI MapKit UIViewRepresentable 无法显示警报
我有一个 SwiftUI 应用程序,其中几个视图是使用 UIViewRepresentable 制作的 MapKit 地图。我有兴趣点的自定义注释,并使用左右标注按钮进行进一步操作。在右侧,我只想显示有关航点的信息。在左侧,我想通过选择进一步的操作来发出警报 - 例如,插入一个新的注释点。在 SwiftUI 之前,我只是提出了一个警报,并做了上述两件事。但据我所知, UIViewRepresentable 版本上没有 self.present 。因此,我无法提供警报。
只是为了一个实验 - 我将 SwiftUI 警报代码附加到调用 MapView 的 SwiftUI 视图中。使用 Observable 布尔值,我确实可以同时发出这两个警报。这对我来说似乎很奇怪,但也许绑定到全局属性的警报代码可以在任何地方。
我的第一次尝试:(结构是 DetailMapView)
然后我删除了警报代码并添加了:
我将呼叫屏幕更改为:
我想如果这是安全的,我可以让它工作 - 但它似乎应该更复杂。
这是这样的想法:
任何指导将不胜感激:Xcode 版本 11.3.1 (11C504)
ios - 如何在 UIViewRepresentable SwiftUI 中重新加载集合视图
## 如何在 UIViewRepresentable 中重新加载集合视图 ##
使用 UIViewRepresentable 和集合视图,在迭代后遇到 reload() 集合视图时卡住了,如何在执行数据迭代时重新加载 UIViewRepresentable 中的集合视图?func updateUIView 不起作用。
ios - SwiftUI View 在嵌入 UIView 时不更新其状态(使用 UIHostingController)
我想通过传递 SwiftUI 将 SwiftUI 视图用作子 UIView(在我的应用程序中位于 UIViewController 内)的内容。但是,SwiftUI 视图一旦嵌入到 UIView 中就不会响应状态更改。
我在下面创建了有问题的代码的简化版本。当点击嵌入在 EmbedSwiftUIView 中的文本视图时,顶部 VStack 的外部文本视图会按预期更新,但嵌入在 EmbedSwiftUIView 中的文本视图不会更新其状态。
ios - SwiftUI UIViewRepresentable MKMapView With Selectable MKCircles 在添加新圆时丢失选择
几天来,我一直在努力让 SwiftUI 与 MKMapView 一起工作。借助此处的帖子
在主(ContentView)SwiftUI 视图中以 UIViewRepresentable 的形式访问 MKMapView 元素
和网上这样的文章
https://www.hackingwithswift.com/books/ios-swiftui/advanced-mkmapview-with-swiftui
我已经设法让一些工作。点击选择放置的圆圈并在选择时以蓝色突出显示它们。然而,我遇到的问题是,每当我向我的圆圈数组中添加一个新圆圈时,所选圆圈就会丢失。
我已经为此上传了一个测试应用程序压缩包(为代码道歉,我的 Swift 知识生疏了,我的 SwiftUI 和 MapKit 更是如此)
该应用程序具有以下结构
- 内容视图
- 在 zstack 中包含我的 MapView 的主 SwiftUI 视图,带有一些按钮
- 包括以下@States
- @State private var circleRegions = MKCircle
- @State private var selectedCircleIndex : Int?
- @State private var selectedCircle:MKCircle?= 无
- 地图视图
- UIViewRepresentable 包装了 MKMapView,并有一个 Coordinator 来处理 MKMapView 回调
- 包括以下 @Bindings 到主要的 ContentView 状态变量
- @Binding var circleRegions : [MKCircle]
- @Binding var selectedCircleIndex : Int?
- @Binding var selectedCircle:MKCircle?
- 协调员
- 将 MapView 作为其父属性并实现所需的 MKMapViewDelegate 方法(包括我们的 mapTapped 方法)的协调器
当 MapView 调用其 MakeUIView() 时,它会创建 MKMapView 并将 Coordinator 设置为映射委托并添加点击手势识别器,如下所示
这个 mapTapped 处理立即向上到它的 MapView 父级来处理点击。
一旦点击被处理到世界空间中,我会根据 circleRegions 数组的@Binding 属性对其进行检查,以确定区域选择是否已更改。然后我更新 selectedCircleIndex 和 selectedCircle @Binding 属性以反映选择,然后我强制重建 MKMapView 的覆盖以确保我可以为这些覆盖创建新的渲染器,此时我可以更新渲染器的颜色以反映选择。
这一切都很好,尽管覆盖在删除和重新添加时会闪烁,但不是世界末日,除了删除和重新添加所有覆盖之外,我找不到更新渲染器颜色的更好方法。
问题是,如果我选择一个圆圈使其变为蓝色,然后稍微滚动地图,然后按圆圈按钮在另一个地方创建一个新圆圈,那么我剩下的两个圆圈都显示为红色,而最后一个选择的那个应该是蓝色的,仍然“选中”(选中的圆圈和索引是正确的)但错误地显示为红色。
对此进行调试,似乎 MapView 的 circleRegions 数组 @Binding 属性在协调器的 mapView(:rendererFor) MKMapViewDelegate 调用期间变为无效空。这会阻止我的代码将圆圈的索引与父级的 circleRegions 进行匹配。更令人困惑的是,如果您在代码中的这一点放置断点,您可以向上堆栈到父 MapView 执行 handleTap() 并调用rebuildOverlays() 时。此时它的 circleRegions 是正确的,但是当我们点击渲染器回调时,它们是无效的。
Swift 使您很难在调用堆栈中的这些不同位置看到 Coordinator 的父 MapView 是同一个实例,因为您无法在不同时间轻松查看 MapView 自身或 Coordinator 父级的指针值。
为了尝试调试或修复这个问题,我添加了一些额外的配置来改变行为
- 地图视图
- 让 dispatchMapViewUpdates = false
- 它控制在点击手势识别器回调中发生的rebuildOverlays() 是立即完成还是分派回主队列
- 让 dispatchMapViewUpdates = false
- 协调员
- let testWithIndex = true // 更新它以使用索引或可选圆圈进行测试
- 哪个控制地图渲染器委托方法是使用选定的索引还是选定的 MKCircle?在父级上判断是否选择了正在渲染的圆圈
可悲的是,这些选项都没有解决这个问题,这让我对正在发生的事情感到困惑。我还确认此问题发生在与模拟器相同的设备上,因此它不是仅模拟器的 SwiftUI 问题。
如果有人有任何想法,我当然会很感激。干杯
swiftui - 使用 SwiftUI 实现 PencilKit 撤消功能
编辑:感谢一些反馈,我已经能够部分工作(更新代码以反映当前更改)。
即使该应用程序似乎按预期工作,我仍然收到“正在修改状态...”警告。如何更新视图的绘图updateUIView
并将新绘图推送到堆栈canvasViewDrawingDidChange
而不导致此问题?我尝试将它包装在调度调用中,但这只会创建一个无限循环。
我正在尝试在UIViewRepresentable
( PKCanvasView
) 中实现撤消功能。我有一个名为 SwiftUI 的父视图WriterView
,它包含两个按钮和画布。
这是父视图:
这是我如何实现我的UIViewRepresentable
:
我收到以下错误:
[SwiftUI] 在视图更新期间修改状态,这将导致未定义的行为。
大概是由我的协调员确实改变了功能引起的,但我不确定如何解决这个问题。解决这个问题的最佳方法是什么?
谢谢!
xcode - 保存 PencilKit 图像 – SwiftUI
我有一个 SwiftUI 视图来使用 UIViewRepresentable PencilKit 视图捕获用户签名。该视图很好地捕获了签名,但是当我尝试保存签名时,保存的文件是空白/空 PNG 文件。