Swift:TableView 控制器和段值更改

Posted

技术标签:

【中文标题】Swift:TableView 控制器和段值更改【英文标题】:Swift: TableView controller and segment value change 【发布时间】:2015-05-07 11:56:36 【问题描述】:

希望你能帮我解决这个问题,因为我有点卡住了......

在我的应用中,我有一个简单的 TableView 控制器,其中包含几个自定义原型单元格。

在其中一个自定义原型单元中,我有一个带有两个值的段控件(在我的例子中是温标 F/C)。

一切都显示正常,我可以更改值(使用值更改操作)但是当我想从 TableView 控制器(例如返回到之前显示的控制器,该值将用于在标签内以正确的比例显示温度)。

如果我在原型自定义单元格 (userSelection) 中有一个变量,则无法在 tableview 类中访问它。

如果我将“值更改”操作移动到 tableview 控制器,我似乎“失去”了跟踪更改内容的能力。

我错过了将这些“粘合”在一起的东西......

非常感谢!

class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

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

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var button1: UIButton!
    @IBAction func pressButton1(sender: AnyObject) 
    



class TableViewController: UITableViewController 
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return 1
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        //let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell
        var cell = tableView.dequeueReusableCellWithIdentifier("customcell") as! TableViewCell
        return cell
    

    class TableViewCell: UITableViewCell 

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

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

        // Configure the view for the selected state
    

    @IBOutlet weak var segment1: UISegmentedControl!

    @IBAction func segmentValueChanged(sender: AnyObject) 
        var userSelection = segment1.selectedSegmentIndex
    

【问题讨论】:

您需要跟踪多个细分状态,还是只跟踪一个? 【参考方案1】:

如果您一次只需要通知一个其他实例,您可以使用委托模式:

定义一个委托协议:

protocol TableViewCellSegmentDelegate 
   func segmentValueChanged(sender: UISegmentedControl)

在您的表格视图单元格中,定义一个委托变量,您可以在值更改时通知它:

class TableViewCell: UITableViewCell 
    var delegate: TableViewCellSegmentDelegate?

    @IBAction func segmentValueChanged(sender: UISegmentedControl) 
        if let delegate = delegate 
            delegate.segmentValueChanged(sender)
        
    

在您的表格视图中,tableView(_:cellForRowAtIndexPath:):

let cell = tableView.dequeueReusableCellWithIdentifier("customcell") as! TableViewCell
cell.delegate = self
return cell

在表格视图中实现协议:

extension TableViewController: TableViewCellSegmentDelegate 
    func segmentValueChanged(sender: UISegmentedControl) 
        // do something with `sender.state`
    

如果您想通知多个实例,您可以在值更改时触发 NSNotification

【讨论】:

以上是关于Swift:TableView 控制器和段值更改的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 和 Firebase - Tableview 未更新

Swift - TableView的协议代理无法正常工作 - 以模态呈现

标签栏、导航栏和段控制的设计问题

当段值更改时,scrollToRowAtIndexPath 不会滚动到正确的位置

Swift 2:更改与选项卡栏控制器相关的视图上的导航标题

Swift - 在 tableView.selectRow 中更改背景颜色