首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >NSViewRepresentable托管NSScrollView的绑定问题

NSViewRepresentable托管NSScrollView的绑定问题
EN

Stack Overflow用户
提问于 2021-08-02 23:11:24
回答 1查看 73关注 0票数 2

我正在尝试创建一个简单的SWiftUI ScrollView,我可以在其中通过绑定设置和获取ScrollView边界偏移量的值。我有以下代码,可以作为ScrollView很好地编译和工作,但我无法实际设置和获取偏移量,并将其传播回托管ScrollView的ContentView。

我有以下几点:

代码语言:javascript
运行
AI代码解释
复制
struct MyScrollView<Content>: NSViewRepresentable where Content: View {
    private var content: Content
    let offset: Binding<CGFloat>
    
    
    init(offset: Binding<CGFloat>, @ViewBuilder content: () -> Content) {
        self.content = content()
        self.offset = offset
    }


    func makeNSView(context: NSViewRepresentableContext<MyScrollView>) ->TheScrollView {
        let view = TheScrollView(offset: offset)
        
        view.hasVerticalScroller = true
        view.hasHorizontalScroller = true
    
        let document = NSHostingView(rootView: content)
        document.translatesAutoresizingMaskIntoConstraints = false
        view.documentView = document
 
        return view
    }

    
    func updateNSView(_ view: TheScrollView, context: NSViewRepresentableContext<MyScrollView>) {
    }
    
}


class TheScrollView: NSScrollView, ObservableObject{
    private var subscriptions: Set<AnyCancellable> = []
    var offset: Binding<CGFloat>
    
    init(offset: Binding<CGFloat>){
        self.offset = offset
        
        super.init(frame: .zero)

        NotificationCenter.default
            .publisher(for: NSScrollView.boundsDidChangeNotification, object: self.contentView.documentView)
            .sink() { _ in
                let view = self.contentView
                print(view.bounds.origin.y)                     // <- I do get this
                self.offset.wrappedValue = view.bounds.origin.y // This does nothing
            }
            .store(in: &subscriptions)
    }
    
    required init?(coder: NSCoder){
        fatalError("init(coder:) has not been implemented")
    }
}

MyScrollView托管在contentView中,如下所示:

代码语言:javascript
运行
AI代码解释
复制
import SwiftUI
import Combine

struct ContentView: View{
    @State var offset: CGFloat = 10.0{
        didSet{
            print("Offset \(offset)")
        }
    }
    
    var body: some View{
        MyScrollView(offset: $offset){
            ZStack{
                Rectangle().foregroundColor(.clear).frame(width: 1200, height: 1000)
                Rectangle().foregroundColor(.blue).frame(width: 100, height: 100)
            }
        }
    }
}

正如您所看到的,偏移值从@State变量传递到MyScollView,然后传递到TheScrollView,后者是NSScrollView的子类。从那里,我有一个简单的通知,以获得边界更改和设置绑定。但是,设置绑定对绑定中的实际值没有任何影响,而且它肯定不会传播回ContentView。此外,offset的地址在层次结构中向上更改,因此看起来我是在将绑定的绑定传递到TheScrollView中,而不是将原始绑定传递给offset,但我似乎无法修复它。

有没有人看到我做错了什么?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 03:58:07

它是State -它在body中使用时会更新,因此请使用如下所示:

代码语言:javascript
运行
AI代码解释
复制
struct ContentView: View{
    @State var offset: CGFloat = 10.0

    var body: some View {
         VStack {
            Text("Offset: \(offset)")          // << here !!
             MyScrollView(offset: $offset){
                    ZStack{
                         Rectangle().foregroundColor(.clear).frame(width: 1200, height: 1000)
                         Rectangle().foregroundColor(.blue).frame(width: 100, height: 100)
                    }
             }
         }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68631750

复制
相关文章
牛逼!表单自动格式化
今天,了不起发现了一个非常有用的宝藏插件:Cleave.js。提供一个简单的方法来格式化您的输入数据,以此增加输入字段的可读性。让你的页面表单使用体验感爆棚~
程序员老鱼
2023/10/25
2040
牛逼!表单自动格式化
Web表单开发之实时格式化显示——Cleave.js
Cleave.js是一个帮助表单实现各种复杂实时格式化显示的工具库,可以说Cleave.js让表单的输入变得更加的高逼格,能实现很多复杂的表单格式化显示,简而言之就是针对<input/>标签按照诸如千分位、电话号码等风格的特定显示!
IT大咖说
2020/12/29
2.2K0
Web表单开发之实时格式化显示——Cleave.js
React Js 中创建和使用 Redux Store
本文,我们将学习在 React 应用中怎么创建 Redux Store。同时,我们将分享怎么使用 Redux store 去管理复杂的 states。
Jimmy_is_jimmy
2023/08/11
3020
React Js 中创建和使用 Redux Store
如何在 React 中引入 less?
本文主要写如何在 React 中引入 less 。因为 less 和 css 非常像,因此很容易学习。而且 less 仅对 css 语言增加了少许方便的扩展,这就是 less 如此易学的原因之一。
子舒
2022/06/09
3.9K0
React篇(020)-如何在 React 中创建组件?
答案:有两种可行的方法来创建一个组件: 1. Function Components: 这是创建组件最简单的方式。这些是纯 JavaScript 函数,接受 props 对象作为第一个参数并返回 React 元素:
齐丶先丶森
2022/05/12
2.9K0
如何在react中使用svg icons
该文介绍了如何在React组件中使用SVG图标。首先介绍了传统的使用方式,然后介绍了使用React组件的方式,最后通过一个名为`Mic`的组件示例展示了如何将SVG图标转换为React组件。通过使用Fis3插件,可以自动将SVG转换为React组件,从而简化了React项目中使用SVG的过程。
IMWeb前端团队
2017/12/29
2.8K0
如何在react中使用svg icons
如何在js中创建对象
七夕临近了,没有对象的来创建一个吧 使用对象字面量: const o = { name: "zehan", greeting() { return `Hi, 我是${this.name}`; } }; o.greeting(); // "Hi, zehan" 使用构造函数: function Person(name) { this.name = name; } Person.prototype.greeting = function () { return `Hi, 我是
ZEHAN
2020/09/23
7.6K0
如何在react中使用svg icons
首先,react是支持svg,所以使用svg是没有问题的,但是到目前为止(版本为v15.3.0)还不支持svg的use标签,所以打算使用svg symbol还是趁早放弃,以下为官方的svg支持标签:
IMWeb前端团队
2019/12/04
1.5K0
如何在react中使用svg icons
WdatePicker 如何在js里获取到选中的值
<input id="executeDateTime" class="txtbox_normal1 form-control Wdate"  onclick="WdatePicker({el:'executeDateTime',dateFmt:'yyyy-MM-dd HH:mm:ss',onpicked:pickedFunc})" tabindex="3" />
爱明依
2019/03/12
11.5K0
如何在 React 中优雅的写 CSS
看目录结构清晰明了,由于“ CSS 文件分离 != CSS 作用域隔离”这样的机制,如果我们不通过一些工具或规范来解决 CSS 的作用域污染问题,会产生非预期的页面样式渲染结果。
政采云前端团队
2019/12/20
4.1K0
如何在 React 中优雅的写 CSS
flutter - 如何在 dart/flutter 中收听流值
如果流不是广播流,则您只能收听一次。 请参阅此 Medium post 以了解有关 Streams 的更多信息。 收听 stream 时,您需要在 _assetsAudioPlayer.currentPosition 函数中添加您的代码。
徐建国
2021/08/30
1.1K0
如何在 React 中快速实现暗黑模式
暗黑模式已成为许多应用程序和网站的最基本功能,因为它可以带来非常好的用户体验。因此在项目中实现暗模式是一项非常有用的技能,使用 ReactJS 和 Chakra UI 可以轻松实现暗模式。
程序那些事儿
2023/07/24
6990
如何在 React 中快速实现暗黑模式
如何在React中写出更好的代码
在React中编写更好的代码的提示,关于Linting、propTypes、PureComponent和其他几个点,帮你编写更好的代码。
用户6835371
2021/09/03
2.5K0
如何在React中写出更好的代码
如何在React中优雅的处理doubleClick
上午楼主遇到一个需要处理双击事件的需求,在这里介绍下如何在触发doubleCLick时间的时候, 不触发click事件的解决办法, 顺便分享给大家。
皮小蛋
2020/03/02
8K2
js中如何判断数组中包含某个特定的值_js数组是否包含某个值
array.includes(searchElement[, fromIndex])
全栈程序员站长
2022/09/27
18.6K0
如何在chrome中实时修改JS
有时候,我们需要去研究人家网站的运行机制,这就免不了要在他们的前端脚本里插入一些调试代码看看运行效果。在chrome65以前,我们可以打开目标网页的开发者工具—source选项卡—目标JS/CSS文件,然后在相关位置写入代码保存后即可看到改动后的效果。chrome65之后需要进行本地代码替换,本文就介绍一下如何在chrome中用本地代码替换在线代码,以达到在线修改JS的效果。
流量黑客
2020/01/02
38.1K2
如何在chrome中实时修改JS
如何在 JS 中“深冻结”对象?
1.如果咱们想要确保对象被深冻结,就必须创建一个递归函数来冻结对象类型的每个属性:
程序狗
2021/09/15
1.7K0
如何在页面中引入JS教程
须位于 <script> 与 </script> 标签之间,放置在 HTML 页面的 <body> 或者 <head> 标签中:
小小鱼儿小小林
2020/06/23
5.5K0
js中6个值为'假'
除了这 6 个外,其它均为“真” ,包括对象、数组、正则、函数等。注意 '0'、'null'、'false'、{}、[]也都是真值 。
用户1349575
2022/01/25
1.3K0
点击加载更多

相似问题

Cleave.js电话CA

13

如何在Vue中结合使用cleave.js和element?

116

在cleave中设置最大值

111

如何使用cleave.js作为表单字段?

114

使用testing-library测试cleave.js组件

259
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文