TableView 单元格操作

Posted

技术标签:

【中文标题】TableView 单元格操作【英文标题】:TableView Cell actions 【发布时间】:2017-09-01 17:15:19 【问题描述】:

我有一个 ViewController,其中包含来自子文件的数据列表。此页面运行完美。在这个页面上有很多酒吧的价格。我想制作另一个场景(SecondViewController)。每次,当我从列表中推送一个酒吧时,我想在另一个场景中显示更多关于那个地方的信息。那次运行,但是当我选择一个酒吧时,程序会显示有关列表中第一个酒吧的信息,当我选择另一个酒吧时,他会显示我之前选择的前一个酒吧。对不起,我的英语很糟糕。请帮助我:D

这是我的视图控制器:

import UIKit

var nev: [String] = []
var cim: [String] = []
var ar: [String] = []


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

var myIndex: Int?

@IBOutlet weak var tableView: UITableView!


override func viewDidLoad() 
    super.viewDidLoad()

    let url = Bundle.main.url(forResource: "pubok", withExtension: "json")
    do 
        let allContactsData = try Data(contentsOf: url!)
        let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : AnyObject]
        if let arrJSON = allContacts["Pubok"] 
            for index in 0...arrJSON.count-1 

                let aObject = arrJSON[index] as! [String : AnyObject]

                nev.append(aObject["Hely neve"] as! String)
                cim.append(aObject["Cím"] as! String)
                ar.append(aObject["Legolcsóbb sör"] as! String)
            
        

        self.tableView.reloadData()
    
    catch 

    



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


func numberOfSections(in tableView: UITableView) -> Int 
    return 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return nev.count



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

    cell.nevLabel.text = nev[indexPath.row]
    cell.arLabel.text = ar[indexPath.row] + "/0.5l"
    return cell


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    myIndex = indexPath.row


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    let vc = segue.destination as! SecondViewController

    vc.myIndex = myIndex

这是我的 SecondViewController:

import UIKit

class SecondViewController: UIViewController 

myIndex: Int?

@IBOutlet weak var secondnevLabel: UILabel!
@IBOutlet weak var secondcimLabel: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()

    secondnevLabel.text = nev[myIndex!]
    secondcimLabel.text = cim[myIndex!]




这是 TableViewCell:

import UIKit

class TableViewCell: UITableViewCell 


@IBOutlet weak var nevLabel: UILabel!
@IBOutlet weak var arLabel: UILabel!




override func awakeFromNib() 
    super.awakeFromNib()



override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)



【问题讨论】:

【参考方案1】:

在第二个视图控制器中有一个局部变量,而不是全局变量myIndex。在第一个视图控制器中使用prepare(for segue:) 将选定的行索引分配给该变量。


视图控制器:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var tableView: UITableView!


    override func viewDidLoad() 
    // etc
    

    // Remove didSelectRowAt

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

        let row = (self.tableView.indexPathForSelectedRow as NSIndexPath?)?.row

        let vc = segue.destination as! SecondViewController

        vc.myIndex = row
    

SecondViewController:

class SecondViewController: UIViewController 

    var myIndex: Int?

    @IBOutlet weak var secondnevLabel: UILabel!
    @IBOutlet weak var secondcimLabel: UILabel!

    // etc

【讨论】:

在视图控制器中通过 vc.myIndex = myIndex 我有一个错误:使用未解析的标识符'myIndex' 现在我有:致命错误:在展开可选值时意外发现 nil。而且我不明白出了什么问题:( 在 SecondViewController 中:secondnevLabel.text = new[myIndex!] 是错误 @B.Boti 变量未设置或正确发送到下一个 vc。尝试在不同的点打印它,看看它是否被设置了 我还有一个问题。当我推一个酒吧时,我会进入 secondviewcontroller 场景,但是当我按下后退按钮并返回时,程序会复制洞列表。所以任何地方都是两次上榜。每次,当我选择一个酒吧并返回时,列表会更长。为什么?

以上是关于TableView 单元格操作的主要内容,如果未能解决你的问题,请参考以下文章

无法执行 tableView 单元格操作

tableview 单元格操作问题 xcode

Swift 将按钮操作添加到 TableView 单元格

TableView 单元格,滑动操作和不同的 segues Swift 4

TableView 单元格操作

点击时突出显示 tableview 单元格,按下警报控制器操作按钮时取消突出显示