Rebol开发:如何正确将文本字段内容追加到text-list列表
Rebol text-list追加条目全被覆盖问题修复
问题根因
Rebol中field控件的/text属性返回的不是输入内容的独立字符串副本,而是控件内部实时存储输入内容的字符串原生引用。每次直接把这个引用追加到txtList/data数据源时,列表存储的所有条目本质都指向内存里的同一个字符串对象。当输入框内容更新时,所有指向该字符串的列表条目会同步显示最新输入值,就会出现旧条目全部被替换、所有条目内容完全一致的现象。
修复方案
获取输入框内容时,用copy函数生成输入内容的独立副本,再追加到列表数据源即可,仅需修改populate函数内的取值逻辑:
populate: does[ country: copy countryField/text ; 加copy生成独立字符串,避免共享引用 append txtList/data country show lay ]
修正后完整可运行代码
REBOL [ Title: "test4" Version: 1.3.3 Author: "me" Purpose: {create a list of countries} ] populate: does[ country: copy countryField/text append txtList/data country show lay ] lay: layout [ across text "Enter name of country" black bold countryField: field return across txtList: text-list panel [ button "Add" [populate] button "Delete" [remove back tail txtList/data show lay] button "Clear" [clear txtList/data show lay] ] ] view lay
可选优化:追加条目后如果需要自动清空输入框,可以在
append逻辑后新增两行代码:clear countryField/text、show countryField,交互体验更顺畅。
内容的提问来源于stack exchange,提问作者marco_rexo
相关产品推荐
相关产品推荐

