SWIFT - 基于选择的UITableViewCell更新

时间:2015-11-24 20:55:56

标签: ios swift uitableview tableview

我有一个TableViewController(让我们调用TVC1),其中一行显示" OD" (代表外径)。

选择此行后,新的TableViewController(允许调用TVC2)中的一堆行显示包含各种OD(我的代码中的casingOD)。我想要发生的是当用户选择OD时,它将使用与用户选择对应的字符串切换回主TableViewController。我的代码目前失败了...任何人都可以帮我指出正确的方向吗?如果您需要TVC1代码,我会高兴地发布它,我只是想为您保存任何不必要的代码读取人员:)

我的TVC2代码如下:

import UIKit

class CasingSelectionTableViewController: UITableViewController {

var selectedData: Data?

let casingOD = ["114.3", "127.0", "139.7", "168.3" , "177.8", "193.7", "219.1", "244.5", "247.6", "273.1", "298.4", "298.4", "339.7", "406.4", "473.0", "508"]

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillAppear(animated: Bool) {
    switch selectedData! {

    case .OuterDiameter:
        print(casingOD)

    case .Weight:
        print(casingWeight114) // I deleted the casingWeight114 line of code as its not required for this question

    case .InnerDiameter:
        print(id114) // I deleted the id114 line as its not required for this question
    }
}

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return casingOD.count

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var casingSpec: UITableViewCell!

    if selectedData == Data.OuterDiameter {
        casingSpec = tableView.dequeueReusableCellWithIdentifier("selectedCasingSpec", forIndexPath: indexPath)
        let casingODSpec = casingOD[indexPath.row]
        casingSpec.textLabel?.text = casingODSpec
        return casingSpec
    } else {
        return casingSpec
    }

}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selection: UITableViewCell!
    selection.textLabel?.text = indexPath.row as! String

}

2 个答案:

答案 0 :(得分:1)

  

我想要发生的是当用户选择OD时,它将使用与用户选择对应的字符串转回主TableViewController。

首先,您需要为TVC2实施一种方式,通知TVC1已选择了某个值。

执行此类操作的常用方法是使用委派。您可以像这样定义委托协议:

protocol TVC2Delegate {
    func tvc2(tvc2: TVC2, didSelectOuterDiameter outerDiameter: String)
}

然后将var delegate: TVC2Delegate?属性添加到TVC2

然后,您可以TVC1通过在TVC2Delegate中实施该方法,使TVC1符合TVC2

TVC1提出TVC2时,请记住将其设置为// In TVC1 tvc2.delegate = self 的委托。

TVC1

要连接TVC2tableView(tableView:,didSelectRowAtIndexPath:),您可以在override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let stringValue = indexPath.row as! String // Do anything you need to do related to TVC2 here. // Then finally delegate?.tvc2(self, didSelectOuterDiameter: stringValue) } 方法中添加一些逻辑来调用具有所选值的代理

TVC1

最后,在TVC2的委托方法实施中,您可以根据需要解雇// In TVC1 class TVC1: UITableViewController, TVC2Delegate { // ... // Implement the method(s) of TVC2Delegate func tvc2(tvc2: TVC2, didSelectOuterDiameter outerDiameter: String) { // Do whatever you need to do with the outerDiameter parameter } } // In TVC2 protocol TVC2Delegate { func tvc2(tvc2: TVC2, didSelectOuterDiameter outerDiameter: String) } class CasingSelectionTableViewController: UITableViewController { var delegate: TVC2Delegate? // ... override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let stringValue = casingOD[indexPath.row] // Do anything you need to do related to TVC2 here. // Then finally delegate?.tvc2(self, didSelectOuterDiameter: stringValue) } }

<强>更新

这是这些位的最终实现可能如下所示:

map.getUiSettings().setZoomControlsEnabled(true);

答案 1 :(得分:1)

使用@Mokagio答案中建议的委托方法。如果你在获取字符串时遇到问题,这就是答案

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

let cell = tableView.cellForRowAtIndexPath(indexPath) as! UITableViewCell
let stringValue = cell.textLabel.text  //You can get this from your datasource as well)

//call the delegate

}