1、今天开始优化ChatWith,比如流式输出、Markdown渲染、深色模式等功能同样也可以加到ChatWith里,另外尝试一下增加多模型设置和切换功能
2、测试下看Cursor能否看懂这种指令“参考NoteWith,完善一下ChatWith在与AI对话时的流式输出和Markdown渲染效果”毕竟上次使用时刚刚用它完善了NoteWith的流式输出和Markdown渲染效果,但看样子Cursor无法在修改一个项目时参考另一个项目的代码
3、在修正“新的实例没有加载已保存的大模型相关配置”这一问题之后,测试流式输出和Markdown渲染的效果,发现还有一些可优化的地方,比如:1.我添加了支持深度思考的模型,但没有看到思考过程,需要同样以流式输出显示思考的过程,并且在样式上要和回答的内容有所区别,且可以将思考过程折叠和展开 2.回答的内容在流式输出时好像会居中显示,也不符合日常的使用习惯 3.正在流式输出时,回答内容的上方有一个灰色的圆形,那是啥?
4、继续修正测试时发现的小问题,比如:1.为什么思考的过程和回答内容都显示不全?2.Markdown渲染效果也有问题,比如同时使用多个Markdown语法时会混合显示部分渲染效果和语法标记,可否把几种比较常见的Markdown语法混用情况写到MarkdownRenderer里?3.应该优先显示思考过程,再显示回答内容,现在会先显示一部分回答内容,然后又弹出了思考内容
5、继续修正测试时发现的小问题,比如:1.在回答过程中会出现上下两部分同时显示的问题,到底哪个是思考过程?2.回答完毕后只剩一个回答结果,但回答过程中内容显示错乱,而且回答过程中无法上下滑动查看回答内容,3.“收藏”页面需要改成列表,以列表形式,显示每条收藏的内容的前两行,并且点击打开后可查看经Markdown渲染的内容
6、继续修正测试时发现的小问题,比如:1.我需要按照这个顺序:先流式输出思考过程,思考完成后,思考内容自动折叠,之后流式输出回答内容。2.目前这版的思考过程和回答内容无法区分,且在对话界面会同时显示两块内容,不知道哪个是思考过程哪个是回答内容,且应用会卡死
7、多次调整之后发现仍然无法搞定思考过程流式输出的需求,好在回答内容可以正常流式输出了,然后让Cursor去掉对话界面顶部的“已加载全部消息”提示,并且收藏列表页顶部添加一条和对话页顶部一样的搜索栏,并且收藏列表的样式、间距等和对话列表保持一致,让界面更统一一些
8、边添加功能边测试真的太重要了,之前用Trae编写ChatWith并且让Cursor做了些优化之后,一直没有实际测试,今天才发现有这么多的细节问题需要调整
9、接下来在设置中增加深色模式切换功能,让用户可以在浅色、深色、跟随系统三个选项间切换,然后增加多模型设置和切换功能,比如可以在设置中添加新模型,可以给不同的模型添加备注,在对话界面可以自行切换模型(显示模型的备注)
10、Cursor在修改过程中出现了单个对话内容太长的提示,可能是因为我在上次修改的基础上继续进行对话,导致触及了单个对话的内容长度限制,于是开启了一个新的对话,好在出现这一提示之前已经构建成功了
11、接下来优化设置界面添加模型、编辑模型的逻辑,在设置界面中点击“添加新模型”时,直接打开添加新模型页面,内容和编辑模型界面一致,然后设置界面的模型名字和备注名字换一下顺序,突出备注名,弱化模型名,之后再根据测试情况继续优化编辑模型的操作方式,以及外观选项的显示效果和位置,模型管理放在上面,外观设置往下挪
12、反复测试并让Cursor优化设置、模型添加/编辑、切换的功能,出现了切换外观不立即全局生效,首次打开编辑模型界面时内容为空的问题,于是让Cursor添加多处调试信息以帮助定位错误,结合调试信息,Cursor解决了首次打开编辑模型界面内容为空的问题,但外观切换不能立即全局生效的问题还存在
13、Cursor解释说SettingsView在sheet内部,可能时因为外观的变动未能正确传递到sheet内部的视图,于是让Cursor将SettingsView拆分成独立的文件,但还是没能解决外观变动不立即全局生效的问题,再次让Cursor检查后快速修正,看来可能将SettingsView拆分成独立文件后的确提升了应用的可维护性,检查和修正问题变得简单些了
14、到今天为止,尝试使用AI(按使用频率排序Cursor>Trae>Lingma)开发应用已经有一个月了,简单总结下:
1.初期构思应用时,需求尽量简单一些,提升首次编写的成功率
2.找到一个心目中的样本,参考它的功能构思自己应用的功能,或者结合它的不足,让Cursor在自己的应用中有针对性的解决
3.后续增加功能时,每增加一个功能就在Cursor中构建,并且在模拟器中测试一下,看是否有明显问题,修正问题之后再增加新功能,不要妄图一次增加太多功能
4.遇到问题,可以让Cursor在代码中添加调试信息,结合调试信息和实测表现,Cursor可以更快地解决问题
5.关于数据持久化方案,零基础开发不要轻易尝试Core Data,UserDefaults对于一个刚刚开发的应用也已经足够了,不可能一步到位,等对Swift足够熟悉之后,再尝试Core Data
6.开发过程中不要频繁切换工具,也不要频繁切换模型,其实Cursor的Auto模式就已经够用了,切换模型可能会导致在修改某个功能的同时,其它功能也被修改
7.可以在开发过程中让Cursor记住你的某些使用习惯,比如默认用哪个型号的模拟器,在修改后先行构建测试,检查有没有语法和编译问题等等
8.如果卡在某个功能上太长时间无法解决,可以开启一个新会话,再让Cursor重新检查问题出在哪儿,或者先妥协一下,缩减一些功能
15、仍然不确定目前ChatWith,以及NoteWith是否能正常展现支持深度思考的模型的思考过程,留给明天吧,今天就到这儿了
标签: NoteWith
DevLog:2025年8月1日
1、我发现在备忘录界面中添加文字时就会一直出现报错信息,Cursor表示这些错误信息主要来自输入法系统,表明在文本输入过程中出现了问题,Cursor对NoteEditView的代码进行了优化,并且优化NoteEditView的主要逻辑,减少不必要的更新
2、Cursor修复完成后再次测试,问题仍然存在,于是要求Cursor评判是否是昨天添加的设置对齐方式的功能,或者限定备忘录默认字体产生的影响
3、Cursor不仅没能修复大量出现的错误,还产生了新的问题:一是创建新备忘录/编辑备忘录时标题栏不显示了,二是创建的新备忘录没有出现在备忘录列表里,先让它把这两个问题解决掉
4、Cursor用添加调试信息的方法快速解决了上面第二个问题,于是让它用类似的方法,添加调试信息,看看能不能解决在添加文字、调整对齐方式时大量出现的错误信息,多次修改之后终于解决了大量报错和应用崩溃的问题
5、在测试其它的格式设置按钮时发现,粗体、斜体、下划线、删除线等格式,一旦设置后就很难取消,正常的话应该再点一次就能取消格式设置,但现在需要点击多次才能取消,在修改过程中还遇到了设置格式时有时会生效有时不生效的问题 ,Cursor表示是格式检查逻辑和UI更新实际的问题,但多次修改后无果
6、决定先简化备忘录的格式设置工具栏,只保留加粗、斜体、下划线、删除线 四个按钮,其它的按钮及相关功能先删掉,但多次修改后仍然不能正常使用格式设置功能
7、决定将目前备忘录编辑界面的富文本编辑器改为Markdown编辑器,并且给这个编辑器添加和AI对话界面相同的Markdown渲染机制,之后再让Cursor移除了底部的工具栏,增加了常驻的字数统计功能,发现Cursor在一些设计细节上做的还是很好的,比如字数统计功能的位置、字体、颜色、对齐、背景、内边距等,都能尽量做到美观
8、之后让Cursor结合应用目前的功能刷新一下README,NoteWith至此暂时结束,下一步优化ChatWith,比如流式输出、Markdown渲染、深色模式等功能同样也可以加到ChatWith里,另外尝试一下增加多模型设置和切换功能
9、最近Cursor更新属实有些频繁,这几天基本一天一更新了,界面和交互上有一些小变化,别的变化暂时没发现
DevLog:2025年7月31日
1、询问了Cursor如果要增强NoteWith对iPad的兼容性,需要做哪些调整,Cursor表示不需要单独开发一个iPad版本,因为SwiftUI提供了很好的跨设备适配能力,可以先使用SwiftUI的响应式设计,之后再涉及iPad专用导航结构,最后再添加拖拽、分屏等高级功能,这样可以实现大部分业务逻辑和服务层代码的复用,只需要维护一套代码,功能更新同时适配两个平台,且用户体验一致
2、而且有这样一个兼容iPad的应用之后,就不用再开发单独的Mac版本,可利用Apple提供的Mac Catalyst技术,将iPad应用转换为Mac应用,无需重写代码,只需在Xcode中启动一个选项,即可保持与iPad版本相同的功能和界面:在Xcode项目设置中选择项目target、在”General”标签页勾选”Mac Catalyst”选项,选择”Mac”作为部署目标
3、发现自己的对NoteWith的设想和腾讯的ima.copilot有点像,决定体验一下ima,参考它来丰富NoteWith的功能,知识库功能更
4、下一步,优化AI问答页面的显示效果,需要支持流式输出,不要等回答完了再一次弹出全部回答内容,如果模型支持深度思考,同样也要以流式输出来展现思考过程,且思考内容与回答内容样式要有所区别,比如思考内容用灰色文字,可折叠/展开,回答内容用黑色文字
5、这个问题看来有点难度,Cursor尝试了多种不同的解决方案,但成功搞定了,之后继续优化,跟Cursor说,有几个小问题需要优化下:1.回答内容右侧的收藏图标,等回答结束后再出现,不要还没回答就出现 2.回答内容貌似不支持Markdown,需要添加对Markdown的支持 3.对话详情页需要跟着回答内容的流式输出自动向下滑动
6、Cursor创建了MarkdownRenderer.swift,并且让我手动添加到Xcode项目中,但模拟器测试发现还是不支持Markdown渲染,另外两个需求已经实现了,继续让Cursor修正,修正一次后发现目前会同时显示Markdown语法和渲染后的效果,继续让Cursor修正,再修正一次后发现如果有文字同时应用多个Markdown语法,会显示一种渲染效果+一种Markdown语法标记,不会只显示渲染效果,继续让Cursor针对集中常见的Markdown语法组合做优化,比如标题+加粗、列表+加粗、引用+加粗,终于解决了这一问题
7、Cursor给出了修改思路:先处理块级语法,再处理行内语法,使用循环处理确保所有标记都被移除,如果找不到结束标记,会移除开始标记,同时避免无限循环和语法错误
8、下一步对备忘录列表和备忘录界面进行优化,设置默认格式,默认采用苹方字体,字体大小默认和AI对话输出的无Markdown语法的字体大小一致,增加对齐方式的选择按钮,选中文字后可设置居中、居左、居右、两端对齐四种对齐方式
9、Cursor完成上述需求后,继续对对齐方式的设置按钮、默认行间距、默认字体大小进行优化,之后让Cursor处理设置对齐方式时DEBUG信息中出现大量错误信息和应用崩溃的问题,目前问题仍然存在
10、下一步在模拟器中测试下,是调整对齐方式时会频繁报错甚至崩溃,还是进行其它操作时会频繁报错,以更精确的定位问题,让Cursor修改
DevLog:2025年7月30日
1、继续对NoteWith进行优化,先对比DoitWith的启动页代码,调整了NoteWith启动页的标题和副标题字体大小,之后让Cursor调换AI对话和备忘录TAB的顺序
2、之后主要调整设置界面,首先把底部的设置改成“我的”,左上角的“设置”也改成“我的”,然后把AI模型相关的设置改成弹窗,目标是:点击“我的”可显示模型设置(点击AI模型设置后打开弹窗,在弹窗中设置API密钥、API地址、模型名称)、数据管理(包含回收站,需要删除回收站的图标)、数据统计(包含AI会话数量、备忘录数量),Cursor在修改完成后没有主动构建,跟Cursor强调了下以后完成每次修改后都构建一下试试
3、发现Cursor在修改底部的导航文字(“设置”改成“我的”)之后,原本的齿轮图标就不合适了,需要替换成比较合适的图标,另外需要在“我的”页面增加深色模式切换功能,可在 跟随系统、浅色、深色 三个选项间切换
4、在模拟器中测试发现,“我的”页面的AI模型、回收站,以及外观设置的三个按钮只有在点击文字和箭头时才会触发对应操作,需要改成点击整行时都能触发对应操作,继续让Cursor修改,Cursor表示是对按钮点击区域进行了优化,移除了Button和buttonStyle(PlainButtonStyle()),改用HStack + contentShape(Rectangle()) + onTapGesture
5、然后优化AI对话中的收藏操作,目前消息右侧的收藏按钮有点小,且位于消息的中间位置,消息比较长时不便于点击收藏,需要调整到消息的顶部位置,并且适当增大收藏按钮,在点击收藏按钮后需要提示收藏成功,在Cursor修改完成后,再对提示文字“已收藏”进行优化,改成了浮在对话界面中间停留一秒后自动消失,Cursor不仅完成了需求,还增加了阴影、动画效果、平滑动画,效果不错,今天到此结束,明天再测试和优化其它功能
DevLog:2025年7月29日
1、今天的目标是把DoitWith的分组功能加回来,目标是:
1.点击右上角的“+”可以选择创建新Todo、创建新分组
2.创建新Todo时可以选择分组
3.点击左上角“Edit”后,每条Todo右侧的删除按钮左边增加一个编辑按钮,点击弹出编辑界面,类似添加Todo界面,可以选择这条Todo的分组、设置截止日期和重复频率
4.设置中增加分组管理功能,可以删除分组,确认后即删除
2、决定让Cursor分步操作,先实现上面和1和2,Cursor增加了分组颜色设置等细节优化,但存在这些问题:新创建的分组不会出现在Todo列表里,我的需求是 即使目前已有的分组下都没有Todo,也要呈现在Todo列表里;另外新创建的Todo也没有出现在Todo列表里,检查一下是怎么回事;还有,创建完分组或Todo后,ActionSelectionView能否自动消失?目前还需要手动点一下取消才会消失
3、让Cursor修正这些问题之后,继续优化,发现点击左上角“Edit”时,只有General分组下的Todo支持拖动排序,其它分组下的Todo同样需要支持拖动排序,另外设置页面的TODO统计,数字也不对,是不是只统计了General分组下的Todo?然后去掉设置中的Reset to Default Data按钮和功能,我不需要
4、Cursor快速修复了上述问题,发现给Cursor的需求要尽量具体到某个按钮的某个功能,还有就是在付费之后Cursor的效率有明显的提升
5、继续修复一些小问题:点击左上角“Edit”后,我需要暂时隐藏掉Todo条目最左侧的圆圈,可能会让人误解这是多选按钮;另外现在每条Todo在点击完成后都无法撤销,我需要在再次点击时撤销完成状态
6、Cursor快速修复了上述问题,继续测试后发现还有问题,从回收站中恢复的Todo条目,不会回到原本所属的分组,而是到了General分组里,继续让Cursor修复问题,Cursor甚至还给出了“如果原来的分组被删除了,恢复的Todo会添加到General分组作为降级处理”的额外方案
7、从2-6的需求全部完成,接下来继续增加编辑Todo、管理分组的功能,先增加编辑Todo的功能,需求是:点击左上角“Edit”后,每条Todo右侧的删除按钮左边增加一个编辑按钮,点击弹出编辑界面(类似添加Todo的界面)可以在编辑界面修改这条Todo的标题、描述,设置截止日期和重复频率
8、Cursor在修改后仍然存在一些问题,一是编辑、删除、拖动排序三个按钮离的有点近,可以稍微拉大一点间距,防止误触,二是点击编辑按钮弹出了“删除”的弹窗,没有进入编辑界面,关于间距的修复,由于编辑、删除按钮和拖动按钮不属于同一个组件,无法调整边距,在尝试两次后撤销了间距调整操作,第二个问题已经修复完成,但存在首次打开Todo编辑界面立即消失,需要再次打开才能编辑Todo的问题,继续让Cursor修复,多次修改未果,点击编辑按钮会弹出删除的弹窗
9、决定换一种交互形式,去掉每条Todo右侧的编辑和删除按钮,改成长按每条Todo弹出菜单,菜单里包含编辑Todo、删除两个功能,点击编辑Todo进入编辑界面,点击删除弹出弹窗,确认后即删除(Cursor认为这样更加简洁,且符合iOS的设计规范)
10、实现这一需求后,发现首次长按Todo条目、编辑Todo时会弹出一个空白页面,再次编辑Todo时才会弹出完整的编辑界面,继续让Cursor检查并修正该问题,多次修改后解决
11、我发现即使不点击左上角的Edit按钮,也能通过长按和拖动来调整Todo的顺序,可以让Cursor去掉左上角的按钮,以及点击按钮后界面的变化相关代码,但要保留拖动调整Todo顺序的功能,Cursor边修改边检查/修复问题,涉及了TodoView.swift、TodoRowView.swift、GroupTodoRowView三个文件
12、接下来继续优化应用,主要针对分组管理:一是在Todo界面搜索栏下方添加几个按钮,按钮上显示分组的名字,点击可以直达该分组所在位置,创建新分组时自动在添加新按钮(Cursor说这叫“分组导航按钮”);二是需要在设置中增加管理分组功能,可以在这里删除分组,删除后该分组内的Todo自动移动到General分组,先增加第一个功能,增加分组导航栏
13、接下来让Cursor实现管理分组功能,Cursor创建了一个新的GroupManagementView视图来管理分组,可以在设置-管理分组中统一查看分组颜色标识、分组名称、分组内的Todo数量,也能点击删除,删除时会有确认对话框,并告知删除后的Todo会移动到General分组里
14、下一步优化搜索功能,目前的搜索框不是很好用,搜不到部分Todo条目,Cursor对搜索功能进行了优化,输入关键词即可在全部Todo内搜索,快速定位到搜索结果,但是有一个问题:在搜索到不在General分组内的Todo时,会同时显示搜索结果和“No Results”的提示,继续让Cursor优化,解决了这个小问题
15、之后让Cursor修改创建分组和Todo界面的英文,改成中文,Cursor还自动同步检查了编辑Todo界面,之后再让Cursor把设置界面的一些英文改成中文,模拟器测试OK,然后让Cursor结合当前应用的功能刷新了一下README
16、检查一下目前的文件中有没有深色模式相关的代码,Cursor检查后发现的确存在深色模式相关代码,但设置界面中没有对应的选项,于是开始修复,涉及了主应用入口、设置、SplashView、RecycleBinView等文件,并且发现存在两个设置文件SettingsView和SettingView,检查后删掉了SettingsView,测试深色模式可正常启用
17、DoitWith先到这里,回到NoteWith,在Xcode模拟器中运行时出现三处被弃用的语法警告,先让Cursor处理一下,之后对NoteWith的功能进行测试
18、首先是备忘录相关功能,点击创建备忘录按钮或右上角加号后,添加内容并保存,并没有出现在备忘录列表里,需要检查一下原因,多次修改后仍然无果,决定先让Cursor把数据存储方式从Core Data改回UserDefaults,这样可以简化数据管理,避免Core Data的复杂性
19、Cursor删除了8个涉及Core Data的文件,并清理其它文件中对Core Data的引用,创建了一个新的简化项目文件,移除所有Core Data相关的引用(已经自动备份了当前的项目文件),之后果然能够正常保存备忘录了,Cursor还是厉害,Core Data等以后比较熟悉了再切换吧,现在先用着UserDefaults
20、目前格式设置按钮在备忘录详情页标题下方,但选中文字时弹出的剪切、复制等按钮就会把格式设置按钮挡住,继续让Cursor修改:需要把格式设置按钮全都挪到备忘录详情页底部、字数统计栏上方,并且增加删除线、设置文字颜色按钮;删掉右侧的“清空内容”按钮;目前工具栏中的“A”图标对应的是什么功能?点击之后会卡死
21、Cursor在修改之后,格式设置功能还是有问题,决定让Cursor修改这些:备忘录详情的格式设置还是有问题,选中文字后,可以设置格式,但再次点击格式按钮后不会取消格式;另外在备忘录列表页,在某条备忘录的空白位置点击就会被标记星号,我的需求是只有点击到星号时才会被标记星号;还有,移除备忘录详情页标题旁边的分享和删除按钮,我暂时不需要;在设置中添加一个回收站功能,管理我删除的备忘录,可以在回收站中恢复已删除的备忘录,这些需求均被Cursor快速完成
22、继续测试并让Cursor优化AI对话页,测试发现在AI对话页面点击创建AI对话按钮和右上角的加号之后,都只会创建新对话,但不直接打开新对话,点击对话列表中的条目也无法打开;另外在设置中填上API密钥、API地址、模型名称后点击右上角保存,不会提示已保存,也不会返回到其它界面,让Cursor一并检查、修复完成,创建新对话后对以弹窗形式打开对话,且对话内容互相独立,设置模型信息之后点击保存会提示已保存,至此NoteWith的基本功能已经OK
23、然后让Cursor删掉了设置页的版本号、项目主页等不重要的信息,以后再继续测试、优化,包括AI对话和备忘录TAB调换顺序,增加深色模式,优化设置界面的交互逻辑(把AI模型相关的设置改成弹窗),“设置”改成“我的”等等
DevLog:2025年7月16日
1、了解了下Cursor的订阅,虽然默认的Auto模式已经足以满足我的需求,但马上两周的免费试用期就要结束了,到时看看功能上有什么变化,如果功能严重受限,考虑订阅Cursor Pro,目前可以用支付宝支付
2、Cursor具备Agent、Ask、Manual、Background四种编程方式,可以根据需求选择,模型方面,Auto模式由Cursor根据任务类型和复杂程度自动判断使用哪个模型,也可以关闭Auto模式,指定模型
3、NoteWith和ChatWith由于涉及接入AI大模型,在上架时可能需要先备案,但备案手续复杂且审核时间长,考虑开发一款不需要进行备案的App
4、赶在Cursor的Pro试用过期之前,让Cursor再帮我开发一个新应用,吸取之前的教训,这次在一开始就提出了尽量详细的需求:
1.iOS平台,应用名称为DoitWith,采用SwiftUI开发
2.应用启动界面以墨绿色为底色,启动界面显示应用名DoitWith,下方一行为副标题“Todo and Note, in one App.”
3.应用界面分为Today、Todo、Note共三个tab,可在底部点击切换,三个tab的右上角都有加号和齿轮图标,Todo界面点加号可选择创建新Todo或创建新分组,笔记界面点加号可以创建新笔记,点击齿轮进入设置界面,Today列表、Todo列表和笔记列表的设计要足够简洁且风格一致一些
4.Today界面列出今天到期的Todo项目,可以长按每条Todo进行完成、重命名、修改、删除等操作
5.Todo界面可以自行设置组(默认有工作、生活两个分组,各有一条示例Todo)、可设置提醒时间,任务过期时文字变红并在文字前添加警告emoji,每条Todo都可以通过长按进行完成、重命名、修改、删除等操作,可将Todo在不同分组间拖动
6.笔记界面默认显示笔记列表,点击创建笔记按钮或笔记列表页右上角加号可创建笔记,采用富文本编辑器,支持常用的文字格式设置,选中文字后即可在底部调节格式
7.设置界面可查看Todo和Note的数量
8.采用你推荐的数据存储方式
5、Cursor对我的需求进行细化和明确,给出了技术选型与架构建议:
-UI 框架:SwiftUI(官方推荐,现代、易维护)
-数据存储:推荐使用 Core Data(苹果官方,适合本地结构化数据,支持分组、提醒、富文本等需求)
-富文本编辑:使用 SwiftUI + NSAttributedString,或集成第三方如 TextEditorPlus(如需更强大功能)
-本地通知:用于 Todo 提醒
-MVVM 架构:便于维护和扩展
以及任务拆解:
-项目初始化与启动页开发
-TabView 主界面搭建
-Today、Todo、Note 三个 Tab 的基本结构
-加号与齿轮按钮功能实现
-Todo 分组、拖动、提醒、过期样式
-Note 富文本编辑器集成
-设置界面开发
-数据存储(Core Data)建模与集成
-本地通知集成
-UI 优化与风格统一
6、Cursor让我在 Xcode 里手动新建一个 SwiftUI iOS App(建议命名为“DoitWith”,语言选择 Swift,生命周期选择 SwiftUI App,勾选“Use Core Data”),之后再进行后续操作
7、在Cursor创建应用的过程中,有两次需要我手动创建NSManagedObject Subclass,昨天在修改NoteWith时也出现了这种情况,猜测可能是因为在数据存储方面采用了Core Data
8、在集成富文本编辑器时,Cursor建议我使用RichTextKit的包管理集成,且Cursor无法自行完成这一操作,需要我在Xcode中Add Packages,集成RichTextKit,但我个人不太喜欢这种功能较为复杂的三方库,于是询问Cursor:有没有iOS自带的组件可以实现类似需求?我对这个编辑器的功能要求不是很高
9、Cursor推荐使用UIKit的UITextViews实现基础富文本编辑,然后通过UIViewRepresentable桥接到SwiftUI,这样无需引入第三方库,且兼容性和性能都很好
10、Cursor在创建完成后提示构建成功,但再次出现了昨天NoteWith的问题“可能有重复的NSManagedObject子类文件,或者Xcode项目引用了同一份文件的多份引用”,明天再看怎么解决
DevLog:2025年7月15日
1、结合Cursor昨天给的建议,对NoteWith做一些功能和性能方面的优化,给Cursor的指令如下:
结合你上面的建议和我的需求,对当前版本做如下优化:
1.备忘录本身的功能优化:增加更多格式设置(选中文字后底部弹出格式设置按钮,点击即可应用格式)、备忘录详情页底部增加常驻的字数统计功能,可通过iOS系统分享面板分享备忘录至其它应用
2.备忘录和AI会话列表页采用分页加载或懒加载,以优化性能
3.采用本地缓存机制Core Data,并将数据存储操作放到后台线程
4.完善网络、存储等异常场景的错误处理,并给予用户友好提示
5.设置界面填写大模型API地址时,无需填写/chat/completions,防止造成重复路径
2、这次耗费的时间比较长,可能是由于需求数量较多,且中途Cursor为应用添加了旧数据迁移机制,但我反馈不需要改机制,因为应用还未上线,之后Cursor有一处频繁出现的错误时Xcode工程结构问题,无法通过代码自动修复,需要在Xcode中手动操作
3、但我这时并未按Cursor的提示手动操作,一直让Cursor帮我处理,多次让Cursor处理并夹杂一些不知道是否正确的手动操作之后,错误越积越多,已达20条,在Xcode中导出错误提示后复制给Cursor,分析原因可能是:
1.自动生成的 NSManagedObject 子类文件重复
你很可能有两份同名的 Core Data 实体类文件,比如:
一份在 Xcode 自动生成的(通常在 .xcdatamodeld 旁边的 “Generated” 文件夹或你指定的目录)
另一份是你之前手写的,或者你把自动生成的文件又拖进了项目,导致重复引用
2.文件被多次添加到 Target
有时候同一个文件被多次添加到 Target(比如拖进项目时勾选了 Copy if needed),也会导致重复编译。
4、Cursor给出的解决办法是,删除所有手写的NSmanagedObject子类,在Finder和Xcode中都检查并删除,只保留自动生成的文件,检查Xcode工程文件引用,删掉多余的文件,完成这两步之后,错误减少至11条。
5、实际操作中我好像把手写的和自动生成的文件搞混了,于是都删掉,再重新生成NSmanagedObject子类
6、之后还是反复出现“Invalid redeclaration”错误,Cursor提示我可能是有重复的文件,或者把同样的文件在Compile Sources列表中添加了两次,但我多次检查并没有重复文件,也没有重复添加,不停的让我检查.xcdatamodeld的Codegen设置,要求每个实体的Codegen设为Manual/None,删除DerivedData,重新打开Xcode,Clean Build Folder,检查Compile Sources,确认每个实体相关的Swift文件只出现一次
7、觉得造成今天这种错误反复出现的原因,可能是我要求切换存储模式为Core Data
8、将目前的项目文件给到Trae,使用新的Doubao-Seed-1.6模型,但直接让Trae检查项目时没有检查出当前的问题,提供错误截图之后,才对重复声明进行修正,这次貌似有点作用,错误消失了一部分,继续让Trae来修正试试,这时思考过程突然变成了英文(可能是公司网络状况不好?但现在大家都下班了,应该不至于啊)
9、Trae修改之后,又跳出来更多错误,没能帮我解决问题
10、怀疑可能是Cursor在处理我今天早上的第三条需求时,添加了数据迁移机制导致的这些问题,于是问Cursor:有没有可能是数据迁移机制导致的今天这些问题?去掉旧数据迁移机制,直接让应用以Core Data来存储数据,是否能解决?Cursor给出了相当于是肯定的答复:去掉旧的数据迁移机制,只用 Core Data 存储数据,确实能解决你遇到的大部分“重复声明”“编译冲突”等问题。只要保证项目里只有一套 Core Data 实体类和数据访问逻辑,相关配置正确,问题基本都能解决。
11、让Cursor去掉了旧的数据迁移机制,只用Core Data存储数据,经过多次且涉及多个文件的修正之后提示构建成功,看来今天这些问题就是由于Cursor在修改存储模式时添加了数据迁移机制导致的
12、接下来优化细节并处理警告,AI对话列表中没有对话时,将“没有找到匹配的AI对话”修改为“还没有AI对话”,将备忘录列表页的“创建第一个备忘录”改成“创建备忘录”,并且处理一下六处警告:/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/Services/CoreDataManager.swift:56:49 Conditional cast from ‘NSManagedObjectID’ to ‘NSManagedObjectID’ always succeeds
13、Cursor提示:所有objectID as? NSManagedObjectID的无意义强转已去除,直接使用note.objectID或session.objectID,这样可以彻底消除你提到的“Conditional cast from ‘NSManagedObjectID’ to ‘NSManagedObjectID’ always succeeds”警告。
14、基本全部搞定了今天一开始的需求,后续在模拟器中测试一下实际使用的体验,进一步优化
DevLog:2025年7月14日
1、今天对NoteWith做一些优化,包括:
1.去掉启动页面的图标,只留应用名和下面的文字就行
2.在模拟器中打开应用时,进入启动页前会有一两秒的白屏,需要去掉,打开应用直接进入启动页
3.在模拟器中运行应用时会有警告,需要修正一下:
/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/ViewModels/AIViewModel.swift:86:21 Capture of ‘self’ with non-sendable type ‘AIViewModel’ in a ‘@Sendable’ closure
2、修正后经Cursor构建和模拟器测试,上述优化均已完成,但还是感觉启动速度有些慢,继续让Cursor优化:感觉应用启动有点慢,虽然现在启动时没有白屏了,但还需要在蓝屏状态下等一两秒才会出现应用明和副标题
3、Cursor检测了当前的启动流程,发现SplashView会显示2秒钟,Cursor对这个问题进行了修正,并通过异步加载数据来减少启动时间,告诉我启动页显示时间由2秒缩短为0.5-1.2秒,并加入了淡入淡出动画,在启动时异步加载数据,主界面准备好后立刻切换,最大程度减少等待,Xcode模拟器测试发现冷启动时仍然会先蓝屏再显示标题和副标题,继续让Cursor优化
4、Cursor指出这是由于当前的启动页SplashView并没有在应用一启动时就立刻渲染,而是先显示了LaunchScreen,然后才切换到SwiftUI的SplashView,Cursor在修改中表示更好的方法是完全移除LaunchScreen配置,让应用直接进入SwiftUI,修改后构建测试成功,Cursor告诉我现在应用冷启动时会立即显示标题和副标题,无蓝屏过渡,直接显示内容,并且会快速进入主界面,数据加载完后立即切换,Xcode测试发现现在启动页面一闪而过,虽然给人一种快速进入应用的感觉,但不利于让用户记住这款应用的名字,决定将启动页面显示时长固定为1秒钟
5、Cursor快速修改,包括:简化启动逻辑,固定显示时间,清理不再使用的代码,但实际测试发现在冷启动时依然会先白屏,然后再显示启动页,不像ChatWith那样可以直接进入启动页,直接问Cursor:现在冷启动时还是会先白屏一下再进入启动页,为啥不能像ChatWith那样启动应用就直接显示启动页呢?
6、Cursor好像理解了我的问题(涉及两个项目之间的对比),并表示需要创建并配置Laucn Screen Storyboard文件,并对PBXFileReference等进行修改
7、Cursor一通操作之后又删除了刚刚创建的LauchScreen.storyboard文件,构建测试成功,再次用Xcode模拟器测试,好像没有任何的变化,应用启动时的表现又回到了今天最初的状态,可能是因为应用在启动时的数据加载要比ChatWith多吗?
8、直接问Cursor这个问题,Cursor表示NoteWith的确需要在启动时加载更多内容,并给出建议,比如将部分数据加载延迟到用户首次访问时,或者进行异步初始化,将数据加载移到后台线程,或者分页加载等等
9、参考Cursor的建议:延迟加载AI会话历史页面,当用户访问该页面时再行加载,以缩短启动时间,Cursor对多个文件进行了修改,将AI对话数据加载从初始化中分离,实现了备忘录数据和AI配置的立即加载,且仅在用户访问AI对话页面时加载AI会话历史,再次进行构建测试,提示成功
10、Xcode测试,好像启动速度的确比之前快了一点点,白屏时间缩短了一些,继续优化:把AI配置也改成延迟加载吧,和AI会话历史一样,仅在用户访问AI对话页面时再行加载。但我忽略了一点,用户在访问AI配置时当然也需要加载配置,但Cursor发现了这个问题,并且进行了同步修改,还是很智能的
11、Cursor总结,现在在启动应用时只加载备忘录数据,访问A对话页面时会加载AI会话历史和AI配置,访问设置页面时加载AI配置,实现了启动性能的提升和按需加载,减少启动时的内存占用,Xcode模拟器测试发现相比上一次修改没有特别明显的变化,后面等真机测试,积累一些数据之后再看看启动性能如何吧
12、用Cursor分别打开NoteWith和ChatWith,并询问同一个问题:你对目前这版应用有什么完善功能、优化性能的建议吗?
13、Cursor对当前版本的NoteWith的功能和性能方面的建议:
基于你目前对NoteWith的启动性能和数据延迟加载优化,整体架构已经非常合理,用户体验也有明显提升。以下是一些进一步完善功能和优化性能的建议,供你参考:
一、功能完善建议
多端同步与云备份
支持 iCloud 或第三方云服务(如 Dropbox、OneDrive)同步备忘录和AI会话,防止数据丢失,方便多设备协作。
搜索与筛选功能
在备忘录和AI会话列表中增加全文搜索、标签筛选、时间排序等功能,提升内容管理效率。
多主题/深色模式自定义
支持更多主题色彩和自定义深浅模式,提升个性化体验。
AI助手能力扩展
增加AI助手的多轮对话记忆、上下文理解、语音输入/输出等功能,提升智能化水平。
数据导入导出
支持导入/导出备忘录和AI会话为常见格式(如txt、markdown、csv),方便迁移和备份。
快捷操作与小组件
支持iOS主屏幕小组件、Siri快捷指令,提升便捷性。
二、性能优化建议
数据分页与懒加载
对于备忘录、AI会话等大数据量列表,采用分页加载或无限滚动,避免一次性加载全部数据。
本地缓存与异步存储
采用本地缓存机制(如 NSCache、Core Data),并将数据存储操作放到后台线程,避免主线程阻塞。
图片与多媒体资源优化
若后续支持图片、音频等多媒体内容,需考虑资源压缩、懒加载和缓存,减少内存占用。
启动流程进一步精简
检查启动流程中是否还有可以异步处理的逻辑,确保主线程尽快渲染首屏。
内存泄漏与资源释放
定期使用 Xcode Instruments 检查内存泄漏,确保大对象及时释放,避免长时间运行后内存膨胀。
三、代码结构与可维护性建议
模块解耦与协议抽象
通过协议(Protocol)和依赖注入解耦各模块,便于单元测试和后续扩展。
单元测试与UI自动化测试
增加关键功能的单元测试和UI自动化测试,提升代码质量和发布稳定性。
错误处理与用户提示
完善网络、存储等异常场景的错误处理,并给予用户友好提示。
如果你有具体想扩展的方向(如AI能力、协作功能、数据安全等),可以进一步细化需求,我可以帮你详细设计实现方案!
14、Cursor对当前版本的ChatWith的功能和性能方面的建议:
非常感谢你的信任!基于你目前的ChatWith应用(多会话AI对话、收藏、会话置顶、API配置、数据本地化、原生SwiftUI等),我有以下功能完善和性能优化建议,供你参考:
一、功能完善建议
消息搜索功能
支持在所有会话或当前会话内全文搜索历史消息,提升信息检索效率。
多模型/多API切换
支持在不同会话中选择不同的模型或API(如GPT-3.5、GPT-4、Claude等),满足多样化需求。
消息多选与批量操作
支持批量收藏、删除、导出消息,提升管理效率。
导出与分享
支持将会话导出为文本、Markdown或PDF,便于归档和分享。
自定义主题/暗色模式
增加主题切换,适配不同用户的视觉偏好。
消息撤回与编辑
支持用户撤回或编辑已发送的消息(本地层面)。
快捷指令/预设Prompt
提供常用Prompt模板,用户可一键插入,提升效率。
多端同步(iCloud/云端)
支持iCloud同步,实现多设备无缝切换。
更丰富的消息类型
支持图片、代码块、表格等富文本消息,提升交互体验。
消息上下文管理
支持设置会话上下文长度、历史消息截断策略,优化大模型调用成本。
二、性能优化建议
异步加载与懒加载
对长会话消息列表采用懒加载,避免一次性渲染全部消息导致卡顿。
本地缓存与数据归档
对历史会话、收藏等数据做分批加载和归档,减少内存占用。
UI渲染优化
使用LazyVStack、@ViewBuilder等SwiftUI高效渲染方式,避免不必要的重绘。
API请求超时与重试机制
增加网络请求的超时、重试和错误恢复机制,提升稳定性。
内存泄漏检测
定期用Instruments等工具检查内存泄漏,优化数据结构和引用关系。
启动速度优化
精简启动流程,异步加载非核心数据,提升冷启动体验。
三、用户体验提升
新手引导与帮助中心
增加首次启动引导页、FAQ或内置帮助,降低上手门槛。
交互动画与反馈
适当增加发送、收藏等操作的动画和提示,提升操作愉悦感。
无障碍适配
适配VoiceOver、动态字体等,提高可访问性。
如需对某一条建议详细展开(如实现思路、代码示例、UI设计等),请随时告诉我!
15、结合Cursor的建议,先对ChatWith进行优化:
结合你的建议,我需要为ChatWith增加如下功能:
1.增加消息搜索功能,搜索栏放在对话列表顶部,可以在所有会话的历史消息中进行搜索,无需保存搜索历史
2.对长会话消息列表采用懒加载,避免一次性渲染全部消息导致卡顿
3.使用SwiftUI高效渲染方式,避免不必要的重绘
4.在收藏消息时增加动画提示,提醒用户“收藏成功,可前往收藏页查看”
5.可长按收藏内容进行取消收藏、复制内容到剪贴板等操作,长按弹出的菜单提示“取消收藏”、“复制收藏”
Cursor对这些需求制定了实现方案,我要求“按你计划的步骤来开发吧,并且每步完成后都使用iPhone 16模拟器构建一下,先不用在模拟器中运行”,Curso开始逐条处理,中间需要多次确认,Cursor很快处理完成并提示构建成功
16、在Xcode模拟器中添加模型测试对话,提示服务器错误:HTTP 404,并且还有两处可以优化:新建对话的顶部不需要“已加载全部消息”的提示,优化一下会话列表的样式,可以改成无边框的卡片式风格,继续让Cursor修改,修改的效果也不是很理想,全部对话列表页的样式太丑了,目前每个卡片的长度是只比标题长一点儿吗?我需要即使标题特别短,卡片边缘也能到达屏幕左右两侧,另外,设置页面的API路径,有没有自动添加/chat/completions?继续让Cursor修改
17、404问题已解决了一部分,目前使用模型时需要在设置中填写不带/chat/completions的API路径,如https://api.deepseek.com/v1/,Cursor解释说实际请求的API路径时“你设置的baseURL+/chat/completions”,设置页面只需填写基础URL,不要带/chat/completions
18、经测试DeepSeek官方的API(API地址是https://api.deepseek.com/v1/)和火山引擎的API(增加了联网搜索能力之后的“应用”,API地址是https://ark.cn-beijing.volces.com/api/v3/bots/)均可正常使用,但OpenRouter的模型仍然会报错404,即使API路径只填写了https://openrouter.ai/api/v1/
19、今天用Cursor修改代码时,在构建测试环节多次出现“看起来没有iPhone 15模拟器,让我使用可用的iPhone 16模拟器来构建”的提示,需要等待iPhone 15模拟器无法进行测试,并多确认一次用iPhone 16模拟器测试(甚至后来还出现了一次用iPhone 14模拟器进行测试),可能是我的Xcode里没有安装iPhone 15的模拟器,但我没有找到从哪里设置Cursor默认的模拟器,且测试过程中还出现了Cursor自动启动模拟器、安装并启动应用的情况
20、这段时间用Cursor一直用的是默认模式,没有手动切换过模型,感觉也基本够用了,可能我的应用功能比较简单吧
DevLog:2025年7月11日
1、用Cursor将AINOTE应用的名字修改成NoteWith,并且在启动页的NoteWith下面增加一行小字“any AI LLM you like.”,将项目文件中出现的AINOTE字样也全部修改为NoteWith
2、Cursor快速修改了应用名称,甚至还同步修改了README文件中的描述,之后添加启动页面视图,用于显示应用名称和副标题,并测试编译是否正常,提示构建成功
3、继续修改部分文件夹和文件名字,并修正项目结构和路径引用等错误,Cursor总结如下:
1.主目录、工程文件夹、所有子目录、Xcode工程target、分组、路径、README、脚本等全部已改为NoteWith。
2.Xcode工程文件(project.pbxproj)所有引用、分组、target、产物名、路径等全部同步为NoteWith。
4、之后前往Xcode用模拟器测试该项目,模拟器运行成功,在GitHub里创建了一个本地库并且把项目文件都挪进去,这下ChatWith和NoteWith两个项目都放到GitHub本地库了,后面再尝试使用GitHub管理项目
5、模拟器测试NoteWith,发现有几个可以优化的细节:
1.备忘录页面,去掉顶部的“仅显示收藏”和“清空搜索”功能,不需要记录搜索历史
2.AI对话界面,去掉底部的清空对话、设置按钮,像备忘录页面那样在右上角增加一个加号,用于开启新对话
3.设置页面,去掉设置AI回复的最大长度(最大令牌数)功能和底部的预设配置选项,设置页面底部增加一个“关于NoteWith”,链接到README文件
让Cursor对这些细节进行调整和优化
6、Cursor今天好像不是很勤快,处理速度有些慢,说完“请稍等,我马上开始”之后就没动静了,再催一次之后才会继续,你不催,它就等,你一催它也能立刻开始
7、处理过程中,会话页面添加加号后Cursor告知目前的设计是点击后清空当前对话,开启新对话,但我的设想不是这样,我进一步明确需求:对话界面右上角的加号,点击后不要清空当前对话,可以直接弹出新对话窗口,并保留之前的对话,在新对话窗口左上角设置返回按钮,返回后可以查看之前的对话记录,Cursor进一步跟我明确了一些细节,比如返回后看到一个会话列表,需要为每个会话命名,以会话的第一个问题作为标题,且在会话列表中显示最后一次对话的时间,这次的改动貌似有点大,需要新增会话数据结构、支持多会话管理、新增会话列表视图、支持会话切换和新建等等,继续让Cursor修改
8、修改完之后询问Cursor目前的代码有没有什么问题和可以优化的地方,Cursor给出7条建议,包含AIService依然依赖旧的aiMessages、AIChatView新建会话按钮不会自动跳转到新会话、会话标题与时间显示优化等等,让Cursor对上述问题全部进行依次优化,之后进行构建测试提示构建成功
9、但用Xcode模拟器测试时发现存在两个错误:
Command SwiftCompile failed with a nonzero exit code
/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/ContentView.swift:41:21 Cannot find ‘AIChatSessionListView’ in scope
反馈给Cursor进行排查和修改,Cursor在修改后,告知如果还有类似“找不到类型/视图的报错,可以尝试清理构建缓存(Product>Clean Build Folder),然后重新编译”
但仍然存在错误,这次是3个:
Command SwiftCompile failed with a nonzero exit code
/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/ContentView.swift:2:8 File ‘ContentView.swift’ is part of module ‘NoteWith’; ignoring import
/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/ContentView.swift:3:8 No such module ‘NoteWith.Views.AIChatSessionListView’
10、原因在于AIChatSessionListView.swift文件确实存在在NoteWith/Views/目录下,但在Xcode中看不到这个文件,需要手动把这个文件添加到Xcode工程,找到这个文件并且拖拽到Xcode左侧栏的对应文件夹下,之后再构建就正常了
11、Cursor向我解释:Xcode工程的文件结构和磁盘物理文件夹是两套系统,在Finder里新建/复制的文件,不会自动出现在Xcode工程中,必须手动添加,只有Xcode工程中出现的文件,才会被编译、识别和引用
12、接下来继续优化应用,Cursor给目前应用的设置界面添加了数据管理功能,包括“清空所有备忘录”、“清空AI对话历史”、“重置所有设置”三个功能,但实际使用时基本不会用到,我都让Cursor给去掉了,另外在AI对话列表界面,最后一次对话的时间改为具体的日期和时间,而不是几分几秒前,Cursor按需求快速进行修正,Xcode模拟器测试成功
13、然后统一了备忘录列表页和AI对话列表页的显示样式,比如在AI对话列表页顶部添加搜索栏,AI对话列表的样式与备忘录列表样式保持一致等,直接开启Xcode模拟器进行测试发现会报错,Cursor分析问题在于:
你在 AIChatSessionListView.swift 里,把 .navigationTitle(“会话列表”) 用在了 VStack 或 if 语句后面,而不是直接用在 NavigationView 或 List 上。
.navigationTitle 只能用于 NavigationView 里的直接内容(如 List、ScrollView、VStack),不能用在条件语句或嵌套结构的外层。
并且给出了推荐写法,我还是让Cursor直接帮我修复了,测试构建成功,只有一处不影响功能的警告,当然也是继续让Cursor给修正,然后Xcode模拟器测试也已正常
14、回想起前几天ChatApp(现已更名ChatWith)在Xcode中测试时提示缺少Content和Preview文件夹,在指定路径手动创建文件夹后就可以正常构建,想让Cursor解决这个问题,但多次测试、修改之后,仍然需要这两个空文件夹存在于指定路径,但Xcode里好像看不到这俩文件夹,不知道怎么回事,Cursor表示:这两个文件夹如果Xcode项目结构里有引用,建议保留(哪怕是空的),如果确定用不到,可以在Xcode中移除引用后再删除
15、给ChatWith的启动界面添加了一个橙色背景,Cursor一开始给我改成了偏土色,后来在Color Hex网站试了一个稍微满意些的橙色(NoteWith的启动界面背景是稍浅的蓝色,且启动界面的文字、样式基本一致,这样会有种系列感)
16、今后任何修改都先在Cursor中进行构建测试,没有问题了再去Xcode中用模拟器测试
17、今后每周在功能补充和优化结束之后,都让Cursor基于应用现有功能更新一下README文件
18、本周对ChatWith和NoteWith的改动很大,涉及应用名称修改、功能增补、界面优化等等
19、为了完成今天这些需求,和Cursor说了十多次“好的继续”,基本上每完成一步就要说一次,还出现了两次可能存在网络问题的提示,是因为这个时间很多人都在用Cursor吗?还是因为公司网络状况不好?
20、猜测前几天在Trae中使用Claude Sonnet 4时多次出现文件被截断的问题,可能是由于触发了Claude Sonnet 4的输出字数限制?