我有一个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
中实现该方法,将TVC2Delegate
comform设置为TVC1
。当呈现
TVC2
时,请记住将其设置为TVC1
的代表。// In TVC1
tvc2.delegate = self
要连接
TVC2
和TVC1
可以向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/