将 属性 从一个 class 更改为另一个 class swift(特别是 UILabel)

change a property from one class in a different class swift (specifically a UILabel)

我试图从另一个 class 中更改 UITableView 中 UILabel 的文本(一个 class 的 属性),但我遇到了问题.代码是这样的(问题出在最后,在myDataSource的didSelectRowAtIndexPath方法中)

视图控制器

class ViewController: UIViewController
{
    //MARK: Properties
    @IBOutlet weak var myTableView: UITableView!
    @IBOutlet weak var myLabel: UILabel!

    //needed so data from myDataSource is retained by ViewController and not just thrown away
    let importedDataSource = myDataSource()


    override func viewDidLoad()
    {
        super.viewDidLoad()

        myTableView.dataSource = myDataSource()
        myTableView.delegate = myDataSource()

    }

   override func didReceiveMemoryWarning()
       {super.didReceiveMemoryWarning()}

}

UITableViewDataSource 和 Delegate

class myDataSource: NSObject, UITableViewDataSource, UITableViewDelegate
{
    let cellIdentifier = "myTableViewCell"
    let myArray = ["Label one", "Label two", "Label three"]

    //MARK: TableViewDataSource
    func numberOfSectionsInTableView(tableView: UITableView) -> Int
     {return 1}

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {return myArray.count}

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! myTableViewCell

        cell.myCellLabel.text = myArray[indexPath.row]

        return cell
    }
    //MARK:TableView Delegate
   func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
     {  
          //This Line Here returns the error
          ViewController().myLabel.text = "test"
          //I want the end product to be ViewController().myLabel.text = myArray[indexPath.row], but left it as "test" just to simplify and isolate the error
     }

}

(还有一个名为 myTableViewCell 的 UITableViewCell class,但为了更短我省略了它)

运行 returns "fatal error: unexpectedly found nil while unwrapping an Optional value" 选择其中一行。我应该如何调用 myLabel 以避免这个问题?我已经尝试通过从情节提要中按住 ctrl 键将其拖动到 myDataSource 中,将它作为 @IBOutlet 连接起来,但正如我所料,它只允许我将它连接到视图控制器。

抱歉,代码与两个名称相似的标签有点混淆。我正在尝试调用在 ViewController(第一段代码)中创建的 myLabel var,而不是在 myTableViewCell(未显示)

中创建的 myCellLabel

您需要获取被点击的实际 table 视图单元格才能访问它的变量。使用 cellForRowAtIndexPath。它看起来像这样:

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    if let myCell = tableView.cellForRowAtIndexPath(indexPath) as? myTableViewCell {
        myCell.myLabel.text = "test"
    }
}

您看到消息“致命错误:在展开可选值时意外发现 nil”的原因是因为您正在尝试为 nil 的 属性 赋值。

在你的 UITableViewDelegate 方法的执行中 tableView(_:didSelectRowAtIndexPath:) 语句:

ViewController().myLabel.text = "test"

  1. 创建您的 ViewController class 的新实例(这就是 ViewController() 所做的)
  2. 访问新实例的 myLabel 属性(回想一下,在 class 的声明中,您将此 属性 定义为类型 UILabel!,一个隐式解包的可选值 UILabel,隐式解包的可选值以 nil 开始,直到它们被赋值)
  3. 尝试将 "test" 分配给 myLabeltext 属性 - 但正如我们刚刚提到的,myLabelnil 并且这就是您收到错误消息的原因

编辑

努力帮助您实现“尝试更改 UI 标签”的既定目标(该标签是 属性 myLabel 你的 ViewController 实例),我推荐的路线是:

  • 让你的 ViewController class 采用 UITableViewDelegate 协议
  • 在您的 ViewController class 中实现您的 UITableViewDelegate 协议方法,在那里他们可以直接访问 myLabel 属性

完成此操作后,该委托方法的实现(现在驻留在 ViewController class 中)将如下所示:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {  
  myLabel.text = myTableView.dataSource.myArray[indexPath.row]
}

...虽然这行得通,但还可以改进 - 我建议您查看 Apple 的 Table View Programming Guide

此外,除非有令人信服的理由不这样做,否则我还建议您让 ViewController class 充当您的 UITableViewDataSource - 来自 Table 视图编程指南:“[t]he class 创建 table 视图通常通过采用 UITableViewDataSource 和 UITableViewDelegate 协议”(参见 section