尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”
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]
为了更清晰的细节,我会在你的细节视图控制器中使用didSet
option
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语句上设置断点,看看是否被调用 所以它被调用了。组织变量中有值吗?以上是关于尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 2 个控制器之间传递数据时,我收到错误无法分配类型“ViewController.Item?”的值键入“项目?”,
设置时区的 SimpleDateFormat 获得正确的值但区域错误