SwiftUI 拖放重新排序 - 检测对象释放

2023-11-24

我实现了一个简单的拖放来重新排序 VStack/Scrollview 中的项目 根据这个解决方案

我将当前拖动的项目存储在名为的属性中draggingItem并将不透明度设置为 0,具体取决于它是否为零。 当 DropDelegate 中的 PerformDrop 被调用时我设置draggingItem返回 nil 以使相应的项目再次可见。

在两种情况下,performDrop 似乎不会被调用:

  1. 当项目处于 onDrag 状态,然后在原地释放而不移动时。

  2. 当项目被释放时,实际的放置区域会稍微偏移。

这导致该项目不再可见,因为draggingItem不会再次设置为零。

关于更好的设置场所的任何想法draggingItem回到零?

enter image description here

View:

struct ReorderingTestsView: View {
    
    @State var draggingItem: BookItem?
    @State var items: [BookItem] = [
        BookItem(name: "Harry Potter"),
        BookItem(name: "Lord of the Rings"),
        BookItem(name: "War and Peace"),
        BookItem(name: "Peter Pane")
    ]
    
    var body: some View {
        VStack{
            ScrollView{
                VStack(spacing: 10){
                    ForEach(items){ item in
                        VStack{
                            Text(item.name)
                                .padding(8)
                                .frame(maxWidth: .infinity)
                        }
                        .background(Color.gray)
                        .cornerRadius(8)
                        .opacity(item.id == draggingItem?.id ? 0.01 : 1) // <- HERE
                        .onDrag {
                            draggingItem = item
                            return NSItemProvider(contentsOf: URL(string: "\(item.id)"))!
                        }
                        .onDrop(of: [.item], delegate: DropViewDelegate(currentItem: item, items: $items, draggingItem: $draggingItem))
                    }
                }
                .animation(.default, value: items)
            }
        }
        .padding(.horizontal)
    }
}

删除视图委托:

struct DropViewDelegate: DropDelegate {
    
    var currentItem: BookItem
    var items: Binding<[BookItem]>
    var draggingItem: Binding<BookItem?>

    func performDrop(info: DropInfo) -> Bool {
        draggingItem.wrappedValue = nil // <- HERE
        return true
    }
    
    func dropEntered(info: DropInfo) {
        if currentItem.id != draggingItem.wrappedValue?.id {
            let from = items.wrappedValue.firstIndex(of: draggingItem.wrappedValue!)!
            let to = items.wrappedValue.firstIndex(of: currentItem)!
            if items[to].id != draggingItem.wrappedValue?.id {
                items.wrappedValue.move(fromOffsets: IndexSet(integer: from),
                    toOffset: to > from ? to + 1 : to)
            }
        }
    }
    
    func dropUpdated(info: DropInfo) -> DropProposal? {
       return DropProposal(operation: .move)
    }
}

测试项目:

struct BookItem: Identifiable, Equatable {
    var id = UUID()
    var name: String
}

我调查了一个问题 1) 并提出了解决方案https://stackoverflow.com/a/72181964/12299030

问题 2) 可以通过自定义覆盖项提供程序和操作来解决deinit,`因为拖动会话取消时提供程序被破坏。

使用 Xcode 13.4 / iOS 15.5 进行测试

demo

主要部分:

    // for demo simplicity, a convenient init can be created instead
    class MYItemProvider: NSItemProvider {
        var didEnd: (() -> Void)?
        deinit {
            didEnd?()     // << here !!
        }
    }

// ...

    let provider = MYItemProvider(contentsOf: URL(string: "\(item.id)"))!
    provider.didEnd = {
        DispatchQueue.main.async {
            draggingItem = nil      // << here !!
        }
    }

完整的测试模块在这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 拖放重新排序 - 检测对象释放 的相关文章

  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • 在故事板中的视图控制器之间滑动手势

    我希望添加左右滑动手势来在视图控制器之间进行更改 这是否可能 并且有没有一种简单的方法可以在故事板中执行此操作 谢谢 故事板允许您在两个视图控制器之间设置 Segues 我想说首先在视图之间附加 Segues 给它一个标识符 然后使用类似的
  • 我可以更改键盘方向吗?

    例如我用这段代码关闭自动旋转 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation return NO BOOL sh
  • 使用 Simulator 时 Xcode 10 中的屏幕截图尺寸错误

    我正在尝试使用 Xcode 10 模拟器为 iTunes 制作屏幕截图 但图像大小错误 我读过Debug gt Optimize Rendering for Window Scale会有帮助 但在 Xcode 中没有这样的选项 有人有这个问
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • iOS 11 安全区域布局指南向后兼容性

    启用安全区域布局指南是否与 iOS 11 以下版本兼容 我设法使用新的安全区域布局指南并保持与 iOS 9 和 iOS 10 的向后兼容性 编辑 正如 NickEntin 的评论所指出的 此实现将假定存在状态栏 但在 iPhone X 的横
  • 无法转换“UINavigationController”类型的值

    我正在为我的应用程序实现一个搜索界面 因此基本上我会将搜索关键字从一个 ViewController 传递到另一个 ViewController 我已经多次进行过这种类型的参数传递 但这次似乎有些奇怪 目标 ViewController 嵌
  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • gdb 声称它不知道如何运行

    我在 Mac Pro 上的 Mac OS X 10 6 6 上使用 Xcode 3 2 3 来构建 GrowlTunes 的修订版 5fd480ef577f咆哮开发存储库 http growl info hg growl developme
  • 在开发过程中自动允许访问 MacOS 辅助功能 API

    我正在开发一个使用辅助功能 API 的应用程序 每次我进行更改和重建时 我都必须删除该应用程序并将其重新添加到下面的 安全和隐私 可访问性 视图中 一段时间后这会变得非常烦人 有没有什么方法可以在开发时禁用此安全检查 或者即使应用程序本身正
  • Xcode 9 - 框架断点

    在 Xcode 7 和 8 中 我已经能够通过在也包含框架项目的 xcworkspace 中运行包含应用程序来调试我一直在开发的框架 如果我在框架中设置断点 它们就会在运行时被触发 在 Xcode 9 beta 6 中 情况不再如此 到目前
  • 文件夹“Images.xcassets”不存在

    当我在最新的 xcode 版本中打开项目文件时 我在两个弹出窗口中收到错误 文件夹 Images xcassets 不存在 我必须多次单击 确定 才能使弹出窗口消失 我没有采取任何措施来删除此类文件夹 有谁知道我为什么会得到它们 Updat
  • 如何安装 xCode 命令行工具?如何将 Xcode 9 beta 与 xCode 8 一起安装?

    工具可用吗 我有一个苹果开发者帐户 并且我下载了 Xcode 9 betahttps developer apple com download https developer apple com download Xcode 9 开发者工具
  • 在 OS X 中,如何检测当前活动应用程序何时发生变化?

    尝试为 OS X 编写一个应用程序 该应用程序根据当前的应用程序触发行为 它不需要与它交互 它只需要知道何时更改以及更改内容 任何人都可以推荐哪些 API 可用于此目的吗 我的猜测是辅助服务中的某些内容 因为这是大多数应用程序 例如 Bet
  • iOS模型层通知Controller对象

    https developer apple com library archive documentation General Conceptual DevPedia CocoaCore MVC html https developer a
  • 如何在 SwiftUI 中将变量从一个视图传递到另一个视图

    我正在尝试将一个变量从一个视图传递到 SwiftUI 中的另一个视图 我有一个重置按钮 我想在另一个视图中将变量设置为零 我尝试在视图一中创建一个新结构并在视图2中访问该变量 View 1 State var count MyNumber
  • SwiftUI 上带有 TextField 的可删除表

    环境 Xcode 11 2 1 11B500 Problem 为了在 SwiftUI 中实现带有 TextField 的可编辑表格 我使用了ForEach 0
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • 解析迁移到 mLabs 和 Heroku 的错误

    我至少一年前将解析数据库迁移到 Mlabs 从那时起我就一直在开发该应用程序 解析仪表板表示我已成功迁移 Mlab 和 Parse 都收到了数据库的更新 然而 在过去一两周内 该应用程序不再经过登录页面 没有调整代码 这是服务器问题 以下是

随机推荐

  • 有人能给我一个node.js应用程序的例子吗

    我试图了解现有的一些较新的 Web 编程框架 即 Node js Rails 和 Sinatra 之间的差异 有人能给我一个最适合每个框架的应用程序示例吗 也就是说 什么是最适合 Node js 而不是 Rails 或 Sinatra 的应
  • Pandas 可以绘制日期直方图吗?

    我已经将我的系列强制转换为 dtype 的日期时间列datetime64 ns 虽然只需要一天的分辨率 不知道如何改变 import pandas as pd df pd read csv somefile csv column df da
  • UIScrollView 缩放后如何重置?

    我有一个正在绘制的图表UIScrollView 是一大块UIView使用自定义子类CATiledLayer作为它的层 当我放大和缩小时UIScrollView 我希望图表能够动态调整大小 就像我从viewForZoomingInScroll
  • 使用 MPMoviePlayerController 禁用 AirPlay

    我有一个实例MPMoviePlayerController它被用来在 iPhone 应用程序上显示一些实时流媒体视频 这工作正常 但我希望删除所有 AirPlay 功能 可以肯定的是 我专门禁用了 AirPlay 如下所示 if self
  • Hibernate 将 NULL 值粘贴到列表中

    我继承了一些使用 Hibernate 的 Java 代码 一些使用此代码的人现在报告说他们到处都遇到 NullPointerExceptions 我已经能够追踪到这一点 发现当我们执行一个从数据库中提取对象列表的查询时 该查询有一个对象列表
  • 如何在 ASP.NET MVC 视图中对 HTML 列表项进行分组?

    我在视图中有这段代码 ul foreach var tag in Model li a href Post Tag tag Id tag Name a li ul 现在我需要按第一个字符对列表项进行分组 例如 A Apple Ant C C
  • 如何使用 Gradle 在 Windows cmd 中执行命令?

    我正在尝试使用 Gradle 执行此命令 build build exe parse p 246 o strings xml bcg novalidate l 1033 sr LbaRoot settings default lss def
  • 计划任务或Windows服务

    我的团队正在争论哪个更好 Windows 服务还是计划任务 我们有一台专门运行作业的服务器 目前它们都是计划任务 有些作业获取文件 重命名它们并将它们放置在网络上的其他目录中 其他作业从 SQL 中提取数据 修改数据并将其传送到其他地方 其
  • Django:MySQL 没有这样的表:aidata.django_session

    我在 Windows 7 上的 Pycharm 中运行 Django 1 4 并且安装了 WAMP 因为我需要将数据存储在 MySQL 表中 这是来自setting py DATABASES default ENGINE django db
  • 将空格转换为换行符

    是否可以使用 CSS 在每个空格上添加换行符 例如 如果我有字符串 Format It 我想像这样显示它 Format It 使用CSS 您可以使用word spacing财产 它定义了单词之间的空间 如果将其设置为容器的大小 它将强制换行
  • React Native - 当数据未更改时强制 ListView 重新渲染

    即使数据源中的数据没有更改 是否可以强制 ListView 重新渲染 我的应用程序的选项卡栏中有一个 ListView 我希望每次选择该选项卡时它都会重绘 无论数据是否相同或已更改 this state data props data da
  • 传递数据到node + express中查看

    我正在使用我的节点应用程序从 API 检索一些数据 并希望在视图中显示该数据并允许用户在那里更改它 我正在调用 api 并获得一个 JSON 响应 我想将其传递到视图上 这就是我正在做的 var query SELECT Id OwnerI
  • Android 蓝牙 StartDiscovery() 始终返回 false

    我试图发现附近的蓝牙设备 但 startDiscovery 总是返回 false 就好像它不起作用一样 因此它无法找到设备 我发现除了蓝牙和蓝牙管理之外 我还必须包含 Coarse Location 权限 但无论如何 它不起作用 这是我现在
  • 如何尝试捕获未找到的程序集

    好的 假设我有一个这样的应用程序 using System using AliensExist some DLL which can t be found 我想要的是 如果找不到程序集 DLL AlienExist 应用程序不会返回错误 而
  • 有趣的NLP/机器学习风格项目——分析隐私政策

    我想就分配给我的一个有趣问题提供一些意见 任务是分析数百个甚至数千个隐私政策并确定它们的核心特征 例如 他们是否获取用户的位置 他们是否与第三方共享 出售 等等 我和一些人交谈过 阅读了很多有关隐私政策的内容 并且自己也思考过这个问题 这是
  • 我将如何格式化 Zend_Form_Element_Radio 以便标签跟随输入?

    Zend Form Element Radio 的默认装饰器是
  • 我的自定义 selinux 策略似乎被 Android 系统忽略

    我在基于 AOSP 的 Android 7 1 2 更准确地说是基于索尼开放设备树 上正确运行自定义 selinux 策略时遇到了一些麻烦 我的问题是审核日志不断告诉我缺少我实际添加的文件访问规则 我还将audit2allow 创建的规则复
  • 查找Excel中的重复行

    我有一个包含两行的 Excel 电子表格 一个是 name 另一个是 id 有什么方法可以找到具有完全相同 id 的行并让我轻松查看这些行吗 例如我有以下行 Name Id Hello 1 World 5 Mylo 1 Jack 6 Jil
  • VBA中日期之间的SQL查询

    我在使用 Excel 和 Access 数据库在 VBA 中进行 sql 查询时遇到问题 在 mi VBA 代码中 我有两个包含以下内容的数据变量 日期最小值 31 07 2014 22 00 00 最大日期 01 08 2014 06 0
  • SwiftUI 拖放重新排序 - 检测对象释放

    我实现了一个简单的拖放来重新排序 VStack Scrollview 中的项目 根据这个解决方案 我将当前拖动的项目存储在名为的属性中draggingItem并将不透明度设置为 0 具体取决于它是否为零 当 DropDelegate 中的