视图模型数据更改时如何禁用动画?
我有以下代码:
struct FormView: View {
@ObservedObject var viewModel: FormViewModel
var body: some View {
List {
ForEach(viewModel.options) { option in
Text(option.displayValue)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每次视图模型更改时List
都会使用动画进行更新。
我怎样才能禁用它?
我尝试添加.animation(nil)
但它没有帮助
假设我有一个应用程序
var storeVM = BookStoreViewModel(bla1: bla1, bla2: bla2, bla3: bla3)
@SceneBuilder var body: some Scene {
WindowGroup {
BookStoreView( model: storeVM )
}
#if os(macOS)
Settings {
SettingsView(model: config)
}
#endif
}
Run Code Online (Sandbox Code Playgroud)
BookStore 有一个 Grid,其中有很多书籍保存在某个 DB 中。
BookView 可以通过以下方式启动:
BookView(model: bookViewModel)
Run Code Online (Sandbox Code Playgroud)
目标:在新的分离窗口中打开 BookView(例如单击按钮)。我怎样才能做到这一点?
奖金问题:如何SettingsView(model: config)
从代码中打开?
PS:NavigationLink
对我来说不是解决方案,因为我没有使用NavigationView
.
SwiftUI 2 中有几个对象,比如Scene和WindowGroup作为某种场景。
在阅读文档并查看与场景相关的 WWDC2020 视频后,我通过以下方式查看层次结构:
单个应用程序 => 一个或多个场景 => 视图层次结构(或几个)
每个场景都包含一个视图层次结构的根视图,并有一个由系统管理的生命周期。每个场景可以以不同的方式显示取决于平台。
我不确定这是用 HStack 和 VStack 控制的,因为在我的测试项目中,由于某种原因,我得到了不同的结果。
我如何控制场景显示?作为示例应用程序有 2 个场景 - 每个 WindowGroup 中有 2 个视图。如何在 macOS 的同一窗口中从一个场景切换到另一个场景?
如何使用 SwiftUI 在新窗口中打开第二个场景?
为什么我们需要WindowGroup?不就是一组视图吗?
一般如何与他们合作?
或者我可以阅读比文档或WWDC 1 分钟视频(从 2.00 到 3.05)中写的更多的细节,因为没有足够的信息来理解该主题。
我在屏幕上有一些文字:
Text("someText1")
Run Code Online (Sandbox Code Playgroud)
是否可以在不创建大量文本项目的情况下突出显示/选择部分文本
我的意思是
Text("som") + Text("eTex").foregroundColor(.red) + Text("t1")
Run Code Online (Sandbox Code Playgroud)
不是我的解决方案
最好有某种修饰符以某种方式突出显示文本的一部分。类似于:
Text("someText1").modifier(.highlight(text:"eTex"))
Run Code Online (Sandbox Code Playgroud)
是否可以?(我的意思是没有创造很多观点)
Target 是具有以下行为的修改:
(但只有 2 个按钮 - 左侧 1 个,右侧 1 个)
行为:
短滑显示按钮并让用户能够点击它。
强长滑动按下按钮。
能够使用 2 指手势
最小可重现示例:
import SwiftUI
public extension View {
func SwiperizeItem(closureL: @escaping () -> (), closureR: @escaping () -> ()) -> some View
{
self.modifier( SwiperizeItemModifier(closureL: closureL, closureR: closureR) )
}
}
struct SwiperizeItemModifier: ViewModifier {
@State var dragOffset = CGSize.zero
@State var offset1Shown = CGSize(width: 100, height: 0)
@State var offset1Click = CGSize(width: 250, height: 0)
@State var offset2Shown = CGSize(width: -100, height: 0) …
Run Code Online (Sandbox Code Playgroud) (仅在 macOS 上尝试过,但我相信 iOS 上也有相同的行为)
macOS 10.15.2 (19C57);Xcode:11.3 (11C29)
(问题已更新,因为我在问题中发现了新的关系)
我有以下代码:
List(model.filteredStatus) { status in
StatusViewRow(status: status, model: self.model)
.contextMenu{
Text("menu 1")
Text("menu 2")
}
}
Run Code Online (Sandbox Code Playgroud)
它运行完美。
但如果我想使用 ForEach 代替(无论为什么):
ForEach(model.filteredStatus) { status in
StatusViewRow(status: status, model: self.model)
.contextMenu{
Text("menu 1")
Text("menu 2")
}
}
Run Code Online (Sandbox Code Playgroud)
不出现上下文菜单。
我已经找到原因了。ForEach
原因是++contextMenu
语句组合工作不正确if
!
ContextMenu 不适用于语句内的行的一部分if
。当我使用 时,在整行上运行良好,并且List
仅在 Toogle 行部分上运行ForEach
。
有人可以解释为什么会这样吗?
我在 contextMenuif
内有一个声明StatusViewRow
没有出现在这部分:
struct StatusViewRow : View {
@ObservedObject var status : …
Run Code Online (Sandbox Code Playgroud) 例如我有 3 个属性:
var path1FilePath:String = "Src/"
var path2FileName: String = "filename"
var path3Extension: String = ".jpg"
Run Code Online (Sandbox Code Playgroud)
我需要用以下方式显示它们:
HStack {
Text(status.path1FilePath)
Text(status.path2FileName).bold()
Text(status.path3Extension)
}
Run Code Online (Sandbox Code Playgroud)
问题是Text()
视图之间的间距。如何去除它们?
假设我有一个适用于 macOS (Catalina) 的应用程序。
这个应用程序没有隐藏。但另一个应用程序被激活(最前面/最上面)
我想捕获按钮/任何其他视图的点击(我使用的是 swiftUI,所以一切都是视图),以防点击我的应用程序。
我怎样才能做到这一点?
UPD:如何使用 SwiftUI 应用“acceptsFirstMouse”来构建应用程序?
我正在尝试对某些页面元素(如 btn 或链接)进行简单的点击。
我编写了 2 个通过 xpath 和 CSS 选择器单击的函数。
这两个功能在浏览器的开发者控制台中都可以完美运行,但在 CEF 中部分不起作用。
怎么会这样?js代码完全一样!...
public void Click(string xpath)
{
var js = "document.evaluate(\"" + xpath + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext().click();";
EvaluateJavascript(js);
}
public void ClickCss(string css)
{
var js = "document.querySelector('"+ css + "').click()";
EvaluateJavascript(js);
}
public async Task EvaluateJavascript(string script)
{
JavascriptResponse javascriptResponse = await Browser.GetMainFrame().EvaluateScriptAsync(script);
if (!javascriptResponse.Success)
{
throw new JavascriptException(javascriptResponse.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
使用的点击代码:
_browser.ClickCss("#upload-container a");
Run Code Online (Sandbox Code Playgroud)
再一次:相同的 js 代码在浏览器开发控制台中完美运行,但由于某种原因在 CEF …