首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI聊天应用:颠倒列表和上下文菜单的痛苦

SwiftUI是一种用于构建跨平台应用程序的用户界面工具包,由苹果公司推出。它采用声明式语法,简化了界面的创建和管理过程,同时提供了丰富的UI组件和动画效果。

聊天应用是一种允许用户通过文本、图片、音频或视频进行实时交流的应用程序。在SwiftUI中,我们可以利用其强大的功能和易于使用的界面构建工具来开发聊天应用。

颠倒列表是指将聊天消息列表中的最新消息显示在列表的顶部,而不是传统的底部。这种方式可以使用户更方便地查看最新的消息,而不需要不断地向下滚动。

上下文菜单是一种在用户长按或右击某个元素时弹出的菜单,用于提供与该元素相关的操作选项。在聊天应用中,上下文菜单可以用于实现对消息的操作,如复制、删除、转发等。

为了实现颠倒列表和上下文菜单,我们可以使用SwiftUI中的List和ContextMenu组件。

List组件是一个用于显示可滚动列表的容器视图,我们可以通过将消息数组进行反转来实现颠倒列表的效果。同时,我们可以使用ForEach来遍历消息数组,并将每个消息显示为列表中的一个行视图。

ContextMenu组件是一个用于创建上下文菜单的视图修饰器,我们可以将其应用于每个消息行视图,以实现长按或右击时弹出菜单的效果。在菜单中,我们可以添加各种操作选项,如复制、删除、转发等。

以下是一个示例代码,演示了如何使用SwiftUI创建一个颠倒列表和上下文菜单的聊天应用:

代码语言:txt
复制
import SwiftUI

struct Message: Identifiable {
    let id = UUID()
    let text: String
}

struct ContentView: View {
    @State private var messages = [
        Message(text: "Hello"),
        Message(text: "How are you?"),
        Message(text: "I'm fine, thank you!")
    ]
    
    var body: some View {
        List {
            ForEach(messages.reversed()) { message in
                Text(message.text)
                    .contextMenu {
                        Button(action: {
                            // 复制操作
                        }) {
                            Text("复制")
                            Image(systemName: "doc.on.doc")
                        }
                        
                        Button(action: {
                            // 删除操作
                        }) {
                            Text("删除")
                            Image(systemName: "trash")
                        }
                        
                        Button(action: {
                            // 转发操作
                        }) {
                            Text("转发")
                            Image(systemName: "arrowshape.turn.up.right")
                        }
                    }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在这个示例中,我们使用了一个名为Message的结构体来表示聊天消息。通过使用@State属性包装器,我们可以在ContentView中创建一个可变的消息数组。然后,我们使用List和ForEach来显示消息列表,并将每个消息文本显示为一个文本视图。通过在文本视图上应用contextMenu修饰器,我们创建了一个上下文菜单,并为每个操作选项添加了相应的处理程序。

腾讯云提供了一系列与移动应用开发和云计算相关的产品和服务,可以帮助开发者构建高效、安全和可扩展的应用程序。以下是一些推荐的腾讯云产品和产品介绍链接地址,适用于SwiftUI聊天应用的开发:

  1. 云服务器(CVM):提供可扩展的计算资源,用于部署和运行应用程序。产品介绍链接
  2. 云数据库MySQL版(CDB):提供高性能、可靠的关系型数据库服务,用于存储和管理应用程序的数据。产品介绍链接
  3. 腾讯云对象存储(COS):提供安全可靠的对象存储服务,用于存储和管理应用程序的文件和媒体资源。产品介绍链接

请注意,以上链接仅供参考,具体的产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

肘子 Swift 周报 | Swift,超越苹果生态!

前一期内容|全部周报列表 原创 新框架、新思维:解析 Observation SwiftData 框架[8] Fatbobman( 东坡肘子 )[9] 这是我在 Let’s VisionOS 2024...除了在聊天工具助手应用场景外,生成式 AI 还能在哪些领域发挥作用?...在实际开发中,Edvinas Byla 意识到 LazyVGrid 性能并不理想,且不能满足他对上下文菜单行为特定需求,因此他决定采用 NSTableView 作为替代方案。...通过对 NSTableView NSTableCellView 精心定制,他不仅显著优化了滚动体验,还解决了上下文菜单相关问题。...实际上,该应用复杂模板编辑器几乎完全使用 SwiftUI 开发,且表现出色。这一点彰显了 SwiftUI 在实际应用强大潜力灵活性。

10810

Ask Apple 2022 与 SwiftUI 有关问答(上)

A:看一下上下文菜单修饰器( contextMenu ) primaryAction 参数。该 API 也有一个 forSelectionType 参数,支持多选。...在 SwiftUI 4.0 中,contextMenu 功能获得了不小提高。例如一个上下文菜单中可以有多个选项、支持 primaryAction、以及可定制预览视图。...例如,你可能希望有一个同时定义了 “窗口组” “文档组” 应用程序,或者有一个 “窗口组” 一个辅助 “窗口” 场景应用程序。...目前我做法是在一个单例中保存对子上下文托管对象引用,然后用一个 URL 打开一个新窗口,这个 URL 在单例中检查上下文托管对象。如果我们能用自定义参数启动新窗口,那就更好了。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。

12.2K20

Ask Apple 2022 与 SwiftUI 有关问答(下)

Table 中上下文菜单Q:如果我在 TABLE 上添加了一个上下文菜单,我如何确定哪一行导致了菜单显示(无需选择该行)?...自定义布局Q:我经常想根据列表中最长或最短文字来布置各种小组件。鉴于动态文本大小在应用程序运行时可能会发生变化,衡量给定字体文本大小最佳方法是什么?A:你好!我们新布局协议支持这个功能。...Swiftcord[12] 代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化在 SwiftUI List 中显示大数据集响应效率[13] 一文,了解苹果工程师推荐方法。...近期,在聊天室中我也看到了类似的讨论( 我本人尚未在 iOS 16 上遇到 )。贴一个临时解决方案。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。

14.7K30

一段因 @State 注入机制所产生“灵异代码”

dump(_n) }}Sheet 视图上下文SwiftUI 创建并显示一个 Sheet 视图时,并非在现有的视图树上创建分支,而是新建一棵独立视图树。...也就是说 Sheet 中视图与原有视图分别处于不同上下文中。在 SwiftUI 早期版本中,对于分别位于不同上下文独立视图树,开发者需要显式为 Sheet 视图树注入环境依赖。...这意味着,相较于在原有视图树上创建分支,在新上下文中重建视图树开销更大,需要进行工作也更多。而 SwiftUI 为了优化效率,通常会对若干操作进行合并。...get set 方法包装。...同时也欢迎你通过 Twitter[5]、 Discord 频道[6] 或博客留言板与我进行交流。订阅下方 邮件列表[7],可以及时获得每周 Tips 汇总。

1.9K20

iBug 16 有感

由于在 SwiftUI 4 中,Lazy 容器表现出现了与以往较大差异,因此已完成大半 《 使用 Lazy 容器注意事项 》一文将暂时搁置,待情况稳定时再更新访问我博客 www.fatbobman.com...尽管在之前版本更新过程中,SwiftUI 也出现了或多或少问题,但从来也没有像 SwiftUI 4 这么严重。...Bug 众多现象不仅仅表现在 SwiftUI 上,在 iOS、macOS 以及苹果很多其他产品上都有所体现。这绝非苹果独有的问题,整个社会目前都处在一种浮躁发展轨迹中。...stay_away_from_bugs_lie_down_together我正以 Twitter[3]、 Discord 聊天室[4] 、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅下方 邮件列表[5],可以及时获得每周 Tips 汇总。

82720

如何结合 Core Data SwiftUI

core data stack SwiftUI Core Data 之间相差将近十年 —— SwiftUI 随着 iOS 13 面世而 Core Data 则是 iPhoneOS 3 产物;...这描述了您数据模型,该数据模型实际上是类及其属性列表。 AppDelegate.swift SceneDelegate.swift 中现在有用于设置 Core Data 额外代码。...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让我重申一下,因为这很重要。...更好是,它已经将其添加到 SwiftUI 环境中,这就是@FetchRequest属性包装器起作用原因——它使用了环境中可用任何托管对象上下文。...self.moc.save() 最后,您现在应该可以运行该应用程序并对其进行尝试——单击几次 “Add” 按钮以生成一些随机学生,您应该看到他们滑入我们列表某个位置。

11.7K30

Swift 周报 第二十期

iOS 16.2 不能升级 Home 应用架构 苹果已取消 iOS 16.2 升级到新 Home 家庭架构选项,iOS 16.2 macOS Ventura 13.1 主要新功能之一是能够升级到新...Home 家庭应用架构。...讨论 Swift 是否允许重载属性[12] 推荐博文 2021 年 SwiftUI: 优势、劣势缺陷[13] 摘要: 这篇文章主要目的是帮助你理解 SwiftUI 利弊,这样你可以就 SwiftUI...通过 ChatGPT SessionToken 就可以不限制网络访问,所以大家发挥想象力实现各种聊天机器人、小程序,而原生 app 可能体验更好 SwiftUI 布局协议 - Part 2 摘要: 在...SwiftUI: 优势、劣势缺陷: https://juejin.cn/post/7140825514108780580 [14] 用 SwiftUI 实现 AI 聊天对话 app - iChatGPT

1.3K40

如何判断 ScrollView、List 是否正在滚动中

比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开侧滑菜单。遗憾是,SwiftUI 并没有提供这方面的 API 。...本文将介绍几种在 SwiftUI 中获取当前滚动状态方法,每种方法都有各自优势和局限性。...在应用程序启动时候,主线程 Runloop 会被自动创建并启动。Runloop 拥有多种模式( Mode ),它只会运行在一个模式之下。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅下方 邮件列表[9],可以及时获得每周 Tips 汇总。

3.7K40

面向所有人 UI 编程 :透过点按弹窗初尝 SwiftUI

若你有兴趣学习 iOS 应用程序开发,又或者是想了解 iOS 程序是如何运行,欢迎关注这一系列文章。我会频繁更新关于 iOS 程序开发各种知识点技巧。...其中 View 表示一个视图,比如我们在手机上看到一个滑条,一张图片,一个列表等种种,都叫做视图;而 Modifier 则是修饰器,它作用是为视图增加功能,比如圆角,动画,阴影,边际,背景等等。...对了,正是这样,这段代码中包含三个针对 VStack 修改器,分别是正文设置为白色 .foregroundColor(Color.white),四周加边距 .padding(),显示点按菜单.contextMenu...终于聊到了点按菜单实现方式了,点按菜单是什么呢?它实质就是一个 View,其它任何 View 并无二致,因此我们需要在 contextMenu 里放一个 View 即可。...若你想仔细学习 SwiftUI 苹果或安卓应用程序开发,欢迎在文末写下你想学习内容,我会参考写文。

2.1K40

Ask Apple 2022 中与 Core Data 有关问答 (下)

主程序与扩展程序数据同步Q:我有一个主应用程序一个扩展程序,它们都读取相同 Core Data 数据库。但是,当我在主应用程序中进行更改时,我扩展程序在重新启动之前不会看到更改。...私有上下文Q:如何配置 Core Data Stack,以便在后台保存更改时,用户可以继续使用应用程序。...我认为这取决于你要求和所需 UX 体验。perform performAndWait 分别对应是在上下文中进行异步/同步操作。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅下方 邮件列表[11],可以及时获得每周 Tips 汇总。

3.2K20

在 Text 中实现基于关键字搜索定位

Fae3VkfVUAAFzqBFae3VkkVUAAga7w考虑到这个问题对于 SwiftUI 应用来说比较新颖,且涉及不少博客中介绍过知识,因此我对聊天室原本给出解决方案进行了重新整理,并通过本文对解决思路...throttle 进一步限制在单位时间内所能进行搜索次数,以保证应用流畅度。...尽管仅在搜索 TranscriptionRow 视图注入两处对性能做了部分优化,但最终流畅度已基本满足需求,也从侧面证明了 SwiftUI 具备了相当实战能力。...从本周开始我将以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅 邮件列表[14],可以及时获得每周 Tips 汇总。

4.2K30

WWDC 23 ,SwiftUI 5 SwiftData 初印象

这从根本上解决了当前影响 SwiftUI 应用( 过渡计算 )效率问题。让开发者可以更加自由来设计数据结构以及随心所欲注入数据源。 不过很遗憾,这项新特性只能在 SwiftUI 5 上实现。...革命性动画视觉效果升级 SwiftUI 原本欠缺一些高级动画视觉功能在本次升级中一并被补上了,而且苹果大幅更新了动画、转场、Shape、效果等方面的内部实现。...这是我目前整理一些有关 SwiftData 问题注意事项( 原文发表在推文中,没有进行更系统归纳): 尚不支持公共和共享数据云同步 在当前版本中,通过其他上下文(ModelContext)创建数据并不会自动合并到视图上下文中...对于绝大多数开发者来说,一旦能够在应用中使用这些新功能,苹果或许又会带来更多新诱惑。SwiftUI 新特性极大拓展了其表达能力,但同时也增加了其学习曲线,特别是对初学者而言。...欢迎你通过 Twitter[5]、 Discord 频道[6] 或博客留言板与我进行交流。 订阅下方 邮件列表[7],可以及时获得每周最新文章。

34410

SwiftUI 中创建自适应程序化导航方案

随着苹果对 iPadOS 不断投入,越来越多开发者都希望自己应用能够在 iPad 中有更好表现。...从 4.0 版本开始,苹果对之前 SwiftUI 有限程序化导航能力进行了大幅度增强,通过引入 NavigationStack NavigationSplitView,开发者基本上具备了全程掌握应用导航状态能力...,由于处在不同上下文中,在 navigationDestination destination 中,必须用单独 struct 来创建视图。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅下方 邮件列表[8],可以及时获得每周 Tips 汇总。

4.2K30

SwiftUI 4.0 全新导航系统

,一分为二方式将让布局表达更加清晰,同时也会强迫开发者为 SwiftUI 应用对 iPadOS macOS 做更多适配。...因此对于支持多硬件平台应用来说,最好针对不同场景分别使用对应导航控件。 两个组件两种逻辑 相较于控件名称上改变,编程式导航 API 才是本次更新最大亮点。...iPad 在 landscape 显示状态下,默认即为此种模式 automatic 默认值,根据上下文自动调整外观样式 在 NavigationTitle 中添加菜单 使用新 navigationTitle...构造方法,可以将菜单嵌入到标题栏中。...另一方面,新导航系统也向每一个开发者传递了明确信号,苹果希望应用能够为 iPad macOS 提供更加符合各自设备特点 UI 界面。

10.2K62

Android 工程师开发 iOS 是怎样体验?

会上线,一款非常有意思应用,你们可以期待一下。...如果在前两年作为 iOS 开发者可能会经常为 Swift 而头疼,因为 Swift 每一次大版本更新,API 都会有很大改动,升级起来很痛苦。...同时如果你用 Xcode 写 SwiftUI 有一个很致命 bug,就是报错信息会提示在错误行,这样导致我在排查错误时候很痛苦。...声明式UI 今年 Google I/O Apple WWDC 不约而同推出了声明式 UI 组件,SwiftUI JetPack Compose,之前写过一篇文章:JetPack Compose...不可否认 iOS 有很多优秀应用,非常棒交互体验,在之前我翻遍了整个 Google play 想找出一个可以媲美 iOS 一样优秀体验应用,不过可惜没有,就连同样在 Android iOS 双平台都上线

1.7K30

解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个在 SwiftUI 所有版本中存在错误,你可以在众多论坛或聊天室里看到不少开发者都在寻找解决方法。...它复现条件如下:iOS 16 系统,在真机或模拟器上测试点击视图列表按钮,可以进入下一级视图。...为了改善 AttributeGraph 效率并减少其占用空间,SwiftUI 会在一些特定情况下对其进行清理维护(例如通过 CFRunLoopObserverCreate 监听 Runtime 空闲时机...因此,当我们首先更新状态,然后 SwiftUI 再响应该状态变化(返回上层视图),即使此时对 AG 进行清理,仍将可以保证 AttributeGraph 完整性,应用自然不会出现问题。...希望 SwiftUI 开发组能尽早重视这些问题。欢迎你通过 Twitter、 Discord 频道 或博客留言板与我进行交流。订阅下方 邮件列表,可以及时获得每周最新文章。

570110

一些适合 SwiftUI 初学者教程

鉴于观看完整教程所需时间不长,初学者可以在通览全部视频对 SwiftUI 有个整体了解后,再决定下一步学习方向内容。...她频道中有关于 SwiftUI 视频,但在此我推荐是她 Swift 基础篇中级篇系列[13]。这个系列相对比较完整,对于初学者掌握 SwiftUI 也十分必要。...Kavsoft 制作视频特点是全程无讲解 + 快放,有关交互效果方面的内容既有实用性又包含相当炫技成分。无论选择学习本文上面介绍哪个教程,初学者都需要一段时间才能撰写具备一定功能应用。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性问题技巧制作成 Tips ,发布在 Twitter 上。...每周也会对当周博客上新文章以及在 Twitter 上发布 Tips 进行汇总,并通过邮件列表形式发送给订阅者。订阅下方 邮件列表[17],可以及时获得每周 Tips 汇总。

1.8K20

SwiftUI + Core Data App 内存占用优化之旅

尽管 SwiftUI 惰性容器以及 Core Data 都有各自内存占用优化机制,但随着应用视图内容复杂( 图文混排 ),越来越多开发者遇到了内存占用巨大甚至由此导致 App 崩溃情况。...本例中,Core Data 数据模型非常简单,只有两个 Entity :Item Picture。Item 与 Picture 之间是一对一关系。...在我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...无优化滚动至底截屏 从 Instruments 分析来看,随着列表滚动,内存占用持续增加中。 无优化效果 相信任何开发者都无法容忍这种内存占用情况出现。...数据多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示时,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片 SwiftUI

1.2K10

SwiftUI + Core Data App 内存占用优化之旅

尽管 SwiftUI 惰性容器以及 Core Data 都有各自内存占用优化机制,但随着应用视图内容复杂( 图文混排 ),越来越多开发者遇到了内存占用巨大甚至由此导致 App 崩溃情况。...本例中,Core Data 数据模型非常简单,只有两个 Entity :Item Picture。Item 与 Picture 之间是一对一关系。...在我们创建完 100 条数据后,重启应用( 重启可以更精准地测量内存占用情况 )并滚动列表至底部。此时该应用内存占用为 1.6 GB 左右。...数据多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示时,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片 SwiftUI...同时也欢迎你通过 Twitter、 Discord 频道 或博客留言板与我进行交流。 订阅下方 邮件列表,可以及时获得每周 Tips 汇总。

2.4K40
领券