在 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”中选择行时调用新视图

UITableView,UILabel 文本颜色在选择行时没有改变? [关闭]

从 UITableView 插入和删除行时如何正确更新数据源?

删除 UITableView 中的行时出错