尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”

Posted

技术标签:

【中文标题】尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”【英文标题】:Trying to pass the value of a label but receiving an error 'Cannot assign value of type 'Organizations?' to type 'String' 【发布时间】:2020-05-31 15:21:24 【问题描述】:

我正在尝试创建一个表格视图,其中一旦选择了一个表格视图单元格,它将单元格的名称传递给一个新的视图控制器。但是,当尝试更改组织名称时,我收到错误消息“无法分配“组织”类型的值?键入“字符串”。如何解决此问题,以便 tableview 单元格的 rowTitle 然后显示为下一个 viewController 上的组织名称?

这是我的第一个视图控制器的代码。

import UIKit

struct Organizations 
var sectionTitle = String()
var rowTitles = [String]()


class SearchOrganizationsViewController: UIViewController 

@IBOutlet weak var tableView: UITableView!

var searchOrganizations: Organizations?
var organizations = [Organizations(sectionTitle: "section 1", rowTitles: ["organization 1", "organization 2", "organization 3"]),
    Organizations(sectionTitle: "section 2", rowTitles: ["organization 1", "organization 2"]),
    Organizations(sectionTitle: "section 3", rowTitles: ["organization 1"])
]

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self


extension SearchOrganizationsViewController: UITableViewDelegate, UITableViewDataSource 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell")
cell?.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
cell?.textLabel?.numberOfLines = 3
if searching 
    cell?.textLabel?.text = self.searchArray[indexPath.section].rowTitles[indexPath.row]
 else 
    cell?.textLabel?.text = self.organizations[indexPath.section].rowTitles[indexPath.row]

return cell!


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
selectedOrganizations = organizations[indexPath.row]
performSegue(withIdentifier: "organizationDetailSegue", sender: self)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
if let destination = segue.destination as? OrganizationsDetailViewController 
    destination.organization = selectedOrganizations 




这是我的第二个视图控制器的代码。

import UIKit

class OrganizationsDetailViewController: UIViewController 

@IBOutlet weak var organizationNameLabel: UILabel!

var organization: Organizations? = nil 
    didSet  self.organizationNameLabel.text = organization?.sectionTitle
 // error is here

var organizationName: String = ""

override func viewDidLoad() 
super.viewDidLoad()

organizationNameLabel.text = organizationName


【问题讨论】:

【参考方案1】:

错误告诉你原因。您正在尝试将组织分配给需要字符串的变量。

您想将其分配给detailController 中的实际organization

或将字符串值分配给行标题之一或您要显示的任何值。

organizationName = selectedOrganization.rowTitles[indexPath.row]

为了更清晰的细节,我会在你的细节视图控制器中使用didSetoption

Class DetailViewController:UIViewController 
  var organization:Organizations? = nil 
  var selectedRow: Int = 0

  func viewDidLoad() 
    super.viewDidLoad()
    setupLabel()
  

  private func setupLabel() 
    guard let org = self.organization else  
      print(“no organization set”)
      return 
    
    self.organizationLabel.text = org.rowTitles[selectedRow]
  

然后在您的 tableView VC 中,我只需将所选组织分配给详细信息中的变量

因此,您可以在didSelectRow func 的 tableView 控制器中添加另一个变量,该变量在您的 selectedOrganization 旁边保存选定的行,将变量设置为选定的行,您应该很高兴

var selectedRow = 0


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
  if let destination = segue.destination as? OrganizationsDetailViewController 
    destination.organization= selectedOrganizations
    destination.selectedRow = selectedRow
  

【讨论】:

您是否强制打开任何东西?您选择的组织是否正在被写入? 您还应该能够从详细信息中删除组织名称字符串值,因为您可以从详细信息中的组织变量访问它 好的,快速搜索显示 IBOutlets 在 prepareForSegue 函数期间返回 nil。我现在将编辑我的答案 好,在guard语句上设置断点,看看是否被调用 所以它被调用了。组织变量中有值吗?

以上是关于尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置文本框值但返回运行时错误 2115

尝试在 2 个控制器之间传递数据时,我收到错误无法分配类型“ViewController.Item?”的值键入“项目?”,

设置时区的 SimpleDateFormat 获得正确的值但区域错误

当标签没有值但属性存在时,需要 XSLT 删除标签

为啥我在尝试快速传递 segue 上的变量时会收到这些错误?

Ajax 传递空值但控制器在 ASP.NET MVC 中为空