我有一个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
}
答案 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
要连接TVC2
和tableView(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
}