【问题标题】:Swift ViewController does not have member namedSwift ViewController 没有名为的成员
【发布时间】:2015-03-09 05:05:52
【问题描述】:

好的,我已经经历了所有应该解决这个问题的线程,但似乎没有一个能解决我的问题。

基本上我有一个带有核心数据的 tableview 设置,当我进入下一个视图控制器时,我想传递一些数据。如您所知,传递的数据必须已经在目标视图控制器中声明,它就是。但我不断收到错误消息,说 ViewController 没有成员名称 nItem(我正在传递的变量)。

这是处理从表视图控制器传递数据的代码部分:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    if segue.identifier == "editCurrentMed" {
        let cell = sender as UITableViewCell
        let indexPath = tableView.indexPathForCell(cell)
        let addEditMedVC : ViewController = segue.destinationViewController as ViewController
        let nItem : Meds = frc.objectAtIndexPath(indexPath!) as Meds
        addEditMedVC.nItem = nItem
    }

}

这是我的视图控制器的顶部,它声明变量以及视图确实加载部分,因为它在编辑数据时访问它。

import UIKit
import CoreData

class addEditMedVC: UIViewController {

    var nItem : Meds? = nil

    @IBOutlet weak var medName: UITextField!
    @IBOutlet weak var dosage: UITextField!
    @IBOutlet weak var timeToTake: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        if nItem != nil {
        medName.text = nItem!.name
        dosage.text = nItem!.dose
        nItem!.time = "Morning"
        }

        // Do any additional setup after loading the view.
}

非常感谢任何帮助。提前致谢。

【问题讨论】:

  • 让 addEditMedVC : ViewController = segue.destinationViewController 作为 ViewController。 “ViewController”不应该是“addEditMedVC”。
  • 我不确定你的意思 aToz
  • 这是 (addEditMedVC.nItem = nItem) 给你错误的行吗?
  • 是的,这是错误行。
  • 改变这一行 let addEditMedVC : ViewController = segue.destinationViewController as ViewController 让 addEditMedVC : addEditMedVC = segue.destinationViewController as addEditMedVC

标签: variables swift core-data member


【解决方案1】:

为可选属性分配非可选值应该可以按预期工作。但是您似乎混淆了您的班级名称。

从您的prepareForSegue 可以看出,目标视图控制器的类是ViewController。然而,在你的类文件中,你写它是UIViewController 的一个子类,称为addEditMedVC(它看起来更像一个变量名,而不是通常大写的类名)。

-> 将你的班级重命名为ViewController

【讨论】:

  • 很抱歉,您推荐的解决方案是什么?诚然,我应该将类名大写,但我不认为它在这里没有影响。当你创建一个 Cocoa Touch 类时,它只提供了选择 UIViewController 的选项,而不是 ViewController。即便如此,在类文件中更改它也没有任何帮助。
  • 对不起,我认为这很明显。称它为ViewController,因此它与您在prepareForSegue 方法中引用的匹配。
  • 嗨,蒙迪。那没有影响。我不能称它为 foo 并且仍然可以工作吗?在我看来,无论如何这只是一个临时常数。让我丧命的是我在其他 2 个应用程序中成功使用了相同的代码,但我看不出它们之间有任何区别。
  • 来吧。当然,您可以随意调用您的变量。你应该重命名你的class,而不是变量!你自己写了let addEditMedVC : ViewController:冒号:后面的部分是类名。将其更改为与视图控制器类的名称相同
【解决方案2】:

更改以下代码:

let addEditMedVC : ViewController = segue.destinationViewController as ViewController
    let nItem : Meds = frc.objectAtIndexPath(indexPath!) as Meds
    addEditMedVC.nItem = nItem

此代码有效:

let vc : addEditMedVC = segue.destinationViewController as addEditMedVC
    let nItem : Meds = frc.objectAtIndexPath(indexPath!) as Meds
    vc.nItem = nItem

【讨论】:

  • 这正是我提出的解决方案。不鼓励使用小写的类名并造成混淆 - 它让您感到困惑!
  • 我只是发布了我选择了你的答案的有效代码。
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多