问题标签 [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.

0 投票
2 回答
1671 浏览

javascript - 在 swiftui 中评估 JavaScript

从 webview 收到消息时,如何让评估 JavaScript 工作?

print(message.body) <--- 这是有效的

parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'", completionHandler: nil) <--- 这不是

0 投票
2 回答
480 浏览

ios - 在 onAppear 中更改状态会破坏 PageViewController

.onAppear我很难理解为什么 PageViewController在其父视图中更改 @Published EnvironmentObject 变量时无法按预期工作。

如果我在 中注释掉.onAppear修饰符DetailView,那么一切正常 - 幻灯片按 PageViewController 的预期滑动。但是一旦该修饰符重新进入,页面就不会正确滑动。

由于状态变化,这与重新渲染有关,但我无法弄清楚。我知道这updateUIViewController是在状态更改时调用的,这似乎会更改 viewControllers 的数组。

如果有人对如何解决这个问题有指导意见,我将非常感激听到它!

如果您正在运行以下代码,请确保更改您的 SceneDelegate:

所以这里有一个简单的问题示例:

0 投票
0 回答
379 浏览

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被多次调用,它也只会进入循环一次,只添加一次图像。

0 投票
2 回答
1268 浏览

ios - SwiftUI MapKit UIViewRepresentable 无法显示警报

我有一个 SwiftUI 应用程序,其中几个视图是使用 UIViewRepresentable 制作的 MapKit 地图。我有兴趣点的自定义注释,并使用左右标注按钮进行进一步操作。在右侧,我只想显示有关航点的信息。在左侧,我想通过选择进一步的操作来发出警报 - 例如,插入一个新的注释点。在 SwiftUI 之前,我只是提出了一个警报,并做了上述两件事。但据我所知, UIViewRepresentable 版本上没有 self.present 。因此,我无法提供警报。

只是为了一个实验 - 我将 SwiftUI 警报代码附加到调用 MapView 的 SwiftUI 视图中。使用 Observable 布尔值,我确实可以同时发出这两个警报。这对我来说似乎很奇怪,但也许绑定到全局属性的警报代码可以在任何地方。

我的第一次尝试:(结构是 DetailMapView)

然后我删除了警报代码并添加了:

我将呼叫屏幕更改为:

我想如果这是安全的,我可以让它工作 - 但它似乎应该更复杂。

这是这样的想法:

在此处输入图像描述

任何指导将不胜感激:Xcode 版本 11.3.1 (11C504)

0 投票
3 回答
2156 浏览

ios - 如何在 UIViewRepresentable SwiftUI 中重新加载集合视图

## 如何在 UIViewRepresentable 中重新加载集合视图 ##

使用 UIViewRepresentable 和集合视图,在迭代后遇到 reload() 集合视图时卡住了,如何在执行数据迭代时重新加载 UIViewRepresentable 中的集合视图?func updateUIView 不起作用。

0 投票
1 回答
2513 浏览

ios - SwiftUI View 在嵌入 UIView 时不更新其状态(使用 UIHostingController)

我想通过传递 SwiftUI 将 SwiftUI 视图用作子 UIView(在我的应用程序中位于 UIViewController 内)的内容。但是,SwiftUI 视图一旦嵌入到 UIView 中就不会响应状态更改。

我在下面创建了有问题的代码的简化版本。当点击嵌入在 EmbedSwiftUIView 中的文本视图时,顶部 VStack 的外部文本视图会按预期更新,但嵌入在 EmbedSwiftUIView 中的文本视图不会更新其状态。

0 投票
0 回答
555 浏览

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() 是立即完成还是分派回主队列
  • 协调员
    • let testWithIndex = true // 更新它以使用索引或可选圆圈进行测试
    • 哪个控制地图渲染器委托方法是使用选定的索引还是选定的 MKCircle?在父级上判断是否选择了正在渲染的圆圈

可悲的是,这些选项都没有解决这个问题,这让我对正在发生的事情感到困惑。我还确认此问题发生在与模拟器相同的设备上,因此它不是仅模拟器的 SwiftUI 问题。

如果有人有任何想法,我当然会很感激。干杯

0 投票
5 回答
2250 浏览

swiftui - 使用 SwiftUI 实现 PencilKit 撤消功能

编辑:感谢一些反馈,我已经能够部分工作(更新代码以反映当前更改)。

即使该应用程序似乎按预期工作,我仍然收到“正在修改状态...”警告。如何更新视图的绘图updateUIView并将新绘图推送到堆栈canvasViewDrawingDidChange而不导致此问题?我尝试将它包装在调度调用中,但这只会创建一个无限循环。


我正在尝试在UIViewRepresentable( PKCanvasView) 中实现撤消功能。我有一个名为 SwiftUI 的父视图WriterView,它包含两个按钮和画布。

这是父视图:

这是我如何实现我的UIViewRepresentable

我收到以下错误:

[SwiftUI] 在视图更新期间修改状态,这将导致未定义的行为。

大概是由我的协调员确实改变了功能引起的,但我不确定如何解决这个问题。解决这个问题的最佳方法是什么?

谢谢!

0 投票
1 回答
235 浏览

swift - 带有 UIViewRepresentable 子类的链式方法

我正在尝试使用以下方法实现 UITextViewUIViewRepresentable

你会注意到editable我想在我的 SwiftUI 结构中使用的变异函数,如下所示:

但是会引发以下异常:

截屏

我怀疑这UIViewRepresentable不是可变的,并想知道是否有办法解决它

0 投票
2 回答
2533 浏览

xcode - 保存 PencilKit 图像 – SwiftUI

我有一个 SwiftUI 视图来使用 UIViewRepresentable PencilKit 视图捕获用户签名。该视图很好地捕获了签名,但是当我尝试保存签名时,保存的文件是空白/空 PNG 文件。