我该如何解决我的字符串问题?

每次我使用我的 Corona SDK 运行这个程序时,都会出现以下错误:

Bad argument #-1 to 'newText' (string expected, got nil)

stack traceback:
    [C]: ?
    [C]: in function 'newText'
    ...Corona Projects/Assignment 4.3/main.lua/src/main.lua:24: in main chunk

点赞
用户2653067
用户2653067

reverseName 函数存在于本地函数中 reverseName(event),但是该函数仅在您按下或点击提交时才会被调用。但是,在您按下提交之前,本地变量 reverse = display.newText(reverseUsersName) 就被调用,这就是为什么会出现错误的原因。

2014-02-10 05:45:51
用户869951
用户869951

唯一访问到的 reverseUsersName 的位置在第 24 行,它在函数 reverseName(event) 中被设置。在这个函数中,reverseUsersName 是全局的,因此在函数运行一次之后,该变量将能够从脚本的其它部分访问,但在此之前,它不存在。

现在在第 22 行,你已经将 reverseName 注册为 "tap" 事件的监听器,但只有在执行一次你的脚本之后才会产生事件(在回调函数中如 reverseNamekeyboardListener 的调用之间),因此当你在之后的显示文本中创建变量时,该变量还不存在。

所以你需要在 reverseName 监听器中更新 reverse 显示项的文本,这样每次单击按钮时,反转后的名字就会显示出来。因此,你需要在 reverseName 函数上方声明 reverse 变量,这样它就可以作为一个 upvalue(请读取 Corona 入门文档,它们很好并且讨论了这个细节)在该函数中使用。并且你可能想要将其初始化为显示用户名称而不是反转后的名称。

因此,你需要像这样写:

local reverse = display.newText(usersName)

local function reverseName(event)
    reverseUsersName = string.reverse(usersName)
    reverse.SetText(reverseUserName)
end

submit:addEventListener("tap", reverseName)

请注意,如果你想每次按下 "tap" 按钮时反转后的字符串在 显示 中都被反转,而不仅仅是第一次按下按钮时,你需要使用以下代码:

local function reverseName(event)
    reverseUsersName = string.reverse(reverseUsersName)
    reverse.SetText(reverseUserName)
end

reverseUsersName = usersName
2014-02-10 16:24:33
用户1979583
用户1979583

请使用以下代码检查您的 reverseName 函数和文本对象(reverse):

local reverse --[[ 初始化全局作用域下的对象,
                   这样您可以在页面的任何地方访问它。 --]]
local function reverseName(event)
  --[[ 在下面的行中,usersName 是一个表格值。 这是错误的原因。
         要从文本字段获取字符串,您必须提供 'usersName.text' --]]
  reverseUsersName = string.reverse(usersName.text)
  reverse.text = reverseUsersName -- 将文本字段值赋值给文本对象
end

submit:addEventListener("tap", reverseName)

reverse = display.newText("",20,20,nil,20) --查看 display.newText() 的参数*
reverse.x = display.contentWidth/2
reverse.y = display.contentHeight/2

*Corona API:display.newText()

2014-02-10 18:29:56