在 UITableView 中选择行时变量不更新
Posted
技术标签:
【中文标题】在 UITableView 中选择行时变量不更新【英文标题】:variable is not updated when row selected in UITableView 【发布时间】:2017-08-04 11:56:34 【问题描述】:我正在尝试使用在 UITableView 中选择的行号来修改变量,以便我可以从另一个 UIViewController 访问该变量,但是当我使用 @987654321 中的行号设置变量的值时@ 看来变量没有改变。
我有一个带有 UITableView 的视图控制器,我想要选择一行,然后,当我单击一个按钮时,会出现一个 Popoverview,我可以在其中参数化链接到我选择的行的内容。
这是我所做的:
import UIKit
class Settings: UIViewController , UITableViewDataSource,
UITableViewDelegate
@IBOutlet weak var tableView: UITableView!
var RowSelected = Int()
let animals = ["Tap", "Double Tap", "Long press", "Swipe up", "Swipe down", "Swipe left", "Swipe right", "Zoom", "Unzoom"]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell"/*Identifier*/, for: indexPath as IndexPath)
cell.textLabel?.text = animals[indexPath.row]
return cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return animals.count
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
RowSelected = indexPath.row
print(RowSelected)
它在这里完美地打印该行,但是当我从另一个 ViewController 访问它时,它总是等于 0。
import UIKit
class GestureConfiguration: UIViewController,
UICollectionViewDataSource, UICollectionViewDelegate, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var actionSelected: UILabel!
let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
var items = ["1", "2", "3", "4", "5"]
var index : Int = 1
var scVC = Settings()
let gestes = ["Tap", "Double Tap", "Long press", "Swipe up", "Swipe down", "Swipe left", "Swipe right", "Zoom", "Unzoom"]
@IBOutlet weak var tableView: UITableView!
func numberOfSections(in collectionView: UICollectionView) -> Int
return 9
// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return self.items.count
// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
collectionView.allowsMultipleSelection = true
// get a reference to our storyboard cell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
// Use the outlet in our custom class to get a reference to the UILabel in the cell
cell.myLabel.text = self.items[indexPath.item]
cell.backgroundColor = UIColor(red:0.13, green:0.37, blue:0.58, alpha:0.7)
cell.layer.borderColor = UIColor.black.cgColor
cell.layer.borderWidth = 1
return cell
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
// handle tap events
let cell = collectionView.cellForItem(at: indexPath)
print("You selected cell #\(indexPath.item + 1) section \(indexPath.section + 1)")
cell?.backgroundColor = UIColor(red:0.08, green:0.28, blue:0.45, alpha:1.0)
///////// HERE \\\\\\\\\\
actionSelected.text = String(scVC.RowSelected)
print(scVC.RowSelected)
// Always print 0, same for the label.
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)
// handle tap events
let cell = collectionView.cellForItem(at: indexPath)
print("You unselected cell #\(indexPath.item + 1) section \(indexPath.section + 1)")
cell?.backgroundColor = UIColor(red:0.13, green:0.37, blue:0.58, alpha:0.7)
我错过了什么?当我将值硬编码为 RowSelected(如 99)时,我可以在第二个 ViewController 中看到 99。
感谢您的帮助。
为 Akhilrajtr 编辑:
class Settings: UIViewController , UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var tableView: UITableView!
var RowSelected = Int()
let animals = ["Tap", "Double Tap", "Long press", "Swipe up", "Swipe down", "Swipe left", "Swipe right", "Zoom", "Unzoom"]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell"/*Identifier*/, for: indexPath as IndexPath)
cell.textLabel?.text = animals[indexPath.row]
return cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return animals.count
//Not overriding any function,
Override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if (segue.identifier == "toPopover")
var secondViewContr = segue.destination as! GestureConfiguration
secondViewContr.scVC = self
还有:
class GestureConfiguration: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var actionSelected: UILabel!
var scVC = Settings()
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
// handle tap events
let cell = collectionView.cellForItem(at: indexPath)
print("You selected cell #\(indexPath.item + 1) section \(indexPath.section + 1)")
cell?.backgroundColor = UIColor(red:0.08, green:0.28, blue:0.45, alpha:1.0)
actionSelected.text = String(scVC.RowSelected)
print(scVC.RowSelected)
【问题讨论】:
在第二个视图控制器中,您正在创建var scVC = Settings()
新实例。所以RowSelected
将是默认值。您如何显示第二个视图控制器?
嗯,我明白我的错误在哪里了,谢谢。但是,我该如何纠正呢?有什么帮助吗?
@Akhilrajtr 带有一个segue(带有标识符)
那么您可以使用prepareForSegue
将值传递给第二个视图控制器。我已经添加了一个答案试试。
只需声明 var RowSelected = Int() global
【参考方案1】:
在GestureConfiguration
中创建一个Settings class
变量,然后在tableViewDelegate
函数中访问它。
在Settings
类覆盖函数prepareforsegue
为
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let gestuedistination = segue.destination as? GestureConfiguration
gestuedistination.settings = self
在GestureConfiguration
类中声明
@IBOutlet weak var actionSelected: UILabel!
var settings:Settings?
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
// handle tap events
let cell = collectionView.cellForItem(at: indexPath)
print("You selected cell #\(indexPath.item + 1) section \(indexPath.section + 1)")
cell?.backgroundColor = UIColor(red:0.08, green:0.28, blue:0.45, alpha:1.0)
actionSelected.text = String(settings!.RowSelected)
print(settings!.RowSelected)
【讨论】:
我在 GestureConfiguration.settings = self 上有一个“实例成员“设置”不能用于类型“GestureConfiguration”错误”; @Hawkydoky 检查更新的答案我只是改变了 gestuedistination.settings = self 请调试设置的值!.RowSelected 并检查它是否为 0,如果正确,则更改 weak var actionSelected: UILabel!为 var actionSelected: UILabel!并检查连接是否正确连接到情节提要。 对不起,我错过了在我的代码中放置的东西,没关系,它正在工作。谢谢你:)【参考方案2】:如果您使用 segue 显示第二个视图控制器,则在设置视图控制器中执行以下方法
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if (segue.identifier == "your segue id")
var secondViewController = segue.destinationViewController as! GestureConfiguration
secondViewController.scVC = self
如果您只需要选定的行标识符,则在GestureConfiguration
中创建一个var
并从prepareForSegue
设置它
【讨论】:
是的,我只需要选定的行标识符。我是 swift 新手,所以我不太明白你所说的“从 prepareForSegue 设置”是什么意思,比如 'var varName = prepareForSegue' ?我觉得很奇怪。 你可以在设置视图控制器中实现prepareForSegue
。而不是 "your segue id"
使用故事板中正确的 segue 标识符。如果没有设置任何标识符,您可以通过选择该 segue 来设置一个。那么上面的代码就可以满足要求了。
与下面一样,我有一个实例成员“scVC”不能用于类型“GestureConfiguration”。另外它不会覆盖函数。
segue 方法签名的准备是错误的,我已经更新了答案。 override func prepare(for segue: UIStoryboardSegue, sender: Any?)
试试这个
@Nikhlesh Bagdiya 回答有效。但是感谢您的帮助和时间,您指出了我看不到的东西:)【参考方案3】:
在我看来问题是因为您在 var scVC = Settings()
中实例化了一个新的视图控制器。相反,每当您创建此 GestureConfiguration
视图控制器时,您应该将引用传递给正确的 Settings
视图控制器,以便 RowSelected
是您想要的。
(虽然最好只传递RowSelected
本身而不是整个Settings
视图控制器,除非您需要视图控制器来处理其他事情)
【讨论】:
【参考方案4】:设置 var globalSetVC = Settings() 的全局对象并在设置视图控制器中保存 rowSelect 像这样
func tableView(_ tableView: UITableView, didSelectRowAt indexPath:IndexPath) globalSetVC.RowSelected = indexPath.row print(globalSetVC.RowSelected)
在需要的地方使用它作为 globalSetVC.RowSelected
【讨论】:
以上是关于在 UITableView 中选择行时变量不更新的主要内容,如果未能解决你的问题,请参考以下文章
Swift-app 在 UITableView 中选择行时崩溃
包含 UISwitch 的 UITableView 单元格更新不一致
UITableView,UILabel 文本颜色在选择行时没有改变? [关闭]