【问题标题】:Could not find member in closure在关闭中找不到成员
【发布时间】:2014-06-04 20:51:02
【问题描述】:

我有以下代码。 promptUIAlertController

self.presentViewController(prompt, animated: true, completion: {
     prompt.textFields[0].becomeFirstResponder()
})

但它给了我这个错误:Could not find member 'becomeFirstResponder'

但是,如果我把它放进去就可以了:

self.presentViewController(prompt, animated: true, completion: {
     let foo = 0
     prompt.textFields[0].becomeFirstResponder()
})

为什么当我添加上面这样的无用代码行时错误消失了?

【问题讨论】:

  • 嗯,是的。我是这么想的。我打算为此提交一份错误报告。如果我听到任何消息,我会更新问题。
  • 顺便说一句,出现错误的原因是因为 AnyObject 不知道“becomeFirstResponder”。仍然没有回答为什么 foo 行可以解决这个问题。
  • @Lucas AnyObject 是从哪里来的? prompt 声明在这段代码的正上方 (var prompt = UIAlertController...)
  • @Newbzors 它带有 textFields 数组。由于 textFields 只是一个 NSArray,这意味着它可以容纳任何对象。因此,通过访问该数组的第 0 个索引,它不能推断它是一个 UITextField。同样,这并不能回答为什么 'let foo = 0' 行修复它,我只是说明为什么我认为该行会抛出“找不到成员 'becomeFirstResponder'”错误。
  • @Lucas 啊,我明白你的意思了

标签: ios swift


【解决方案1】:

根据 Swift Programming Language 书籍中有关 If 语句和强制展开的部分,

“您可以使用 if 语句来查明可选项是否包含值。如果一个可选项确实有一个值,它的计算结果为真;如果它根本没有价值,它的评估结果为假。 一旦你确定可选项确实包含一个值,你就可以访问它的底层值”

UIAlertController 不必有 textFields,所以因为 textFields 数组是可选的,所以你必须先解开它,然后才能调用数组内的对象上的函数,所以它应该看起来像这样:

self.presentViewController(prompt, animated: true, completion: {
    if let textFields = prompt.textFields {
       textFields[0].becomeFirstResponder()
    }
})

【讨论】:

  • if let textField = textFields[0] ...这样,如果存在 [0] 元素,您将输入代码块
  • 谢谢你的解释,这对我来说很有意义。无论如何,我向 Apple 报告了一个错误,输入 let foo = 0 不应使错误消失
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2019-09-03
相关资源
最近更新 更多