将 属性 从一个 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"
- 创建您的
ViewController
class 的新实例(这就是 ViewController()
所做的)
- 访问新实例的
myLabel
属性(回想一下,在 class 的声明中,您将此 属性 定义为类型 UILabel!
,一个隐式解包的可选值 UILabel
,隐式解包的可选值以 nil
开始,直到它们被赋值)
- 尝试将 "test" 分配给
myLabel
的 text
属性 - 但正如我们刚刚提到的,myLabel
是 nil
并且这就是您收到错误消息的原因
编辑
努力帮助您实现“尝试更改 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)
我试图从另一个 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"
- 创建您的
ViewController
class 的新实例(这就是ViewController()
所做的) - 访问新实例的
myLabel
属性(回想一下,在 class 的声明中,您将此 属性 定义为类型UILabel!
,一个隐式解包的可选值UILabel
,隐式解包的可选值以nil
开始,直到它们被赋值) - 尝试将 "test" 分配给
myLabel
的text
属性 - 但正如我们刚刚提到的,myLabel
是nil
并且这就是您收到错误消息的原因
编辑
努力帮助您实现“尝试更改 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)