我有一个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

}

最佳答案

我想发生的是当用户选择OD时,它将用与用户选择相对应的字符串返回到主TableViewController。
首先,您需要实现一种TVC2通知TVC1已选择值的方法。
做这种事情的一个常见方法是使用委托。您可以定义如下委托协议:

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

然后将var delegate: TVC2Delegate?属性添加到TVC2
然后,通过在TVC1中实现该方法,将TVC2Delegatecomform设置为TVC1
当呈现TVC2时,请记住将其设置为TVC1的代表。
// In TVC1
tvc2.delegate = self

要连接TVC2TVC1可以向TVC2方法添加一点逻辑,用选定的值调用委托
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)
}

最后,在tableView(tableView:,didSelectRowAtIndexPath:)的delegate方法的实现中,如果需要的话,可以忽略TVC1
更新:
这些位的最终实现可能是这样的:
// 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)
    }
}

关于ios - SWIFT-基于选择的UITableViewCell更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33903625/

10-12 00:41