我有一个带有分段控制元素的UIViewController。在此之下,我有两个重叠的容器视图,可以在故事板中自动创建各自的视图。我没有问题链接这些视图并呈现相应的所选分段控件的每个视图。
我的问题在于我尝试在其中一个容器视图中实现表视图并传递数据以填充视图。为了解决这个问题,我可以说我有3个View Controllers。
vc1的类型为UITableViewController:包含一个类别表。
vc2的类型为UIViewController:保存分段控件和两个重叠的容器视图。
vc3的类型为UIViewController:是一个容器视图,它有一个UITableView(我已从故事板中拖入)。此表显示通过vc1中的单元格选择的类别中的项目列表。
通常情况下,我可以使用适当的数据填充vc3,只需在vc1中使用prepareForSegue方法显示表的项目列表,但由于额外的ViewController在这两个ViewController之间,我还没有能够完成相同的结果。
总体目标是使用vc1中所选单元格中的相应数据填充vc3中的tableView。
分段视图控制器是VC2 - 在示例中我称为类别。在代码中实际上是一个保存目的地的Trip。所以该类别是旅行的事情。一个类别中的项目作为旅行中的目的地(即目的地是vc3中填充表格的内容)
import UIKit
class SegmentedViewController: UIViewController {
var trip: Trip!
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var itineraryContainer: UIView!
@IBOutlet weak var plannerContainer: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = trip.tripName
itineraryContainer.hidden = true
//Setting the initial container to be viewed to match the segmentedcontrol
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func segmentedControlAction(sender: UISegmentedControl) {
switch segmentedControl.selectedSegmentIndex {
case 0:
plannerContainer.hidden = false
itineraryContainer.hidden = true
break
case 1:
plannerContainer.hidden = true
itineraryContainer.hidden = false
break
default:
break
}
}
}
规划师视图控制器(容器
import UIKit
class PlannerViewController: UIViewController, UITableViewDataSource {
var trip: Trip!
var valueToAppend: String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return trip.destinations.count
}
private struct Storyboard {
static let CellReuseIdentifier = "Destination"
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.CellReuseIdentifier, forIndexPath: indexPath)
//configure cell
cell.textLabel?.text = trip.destinations[indexPath.row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated:true);
}
}
答案 0 :(得分:2)
我们使用委托协议在我们的应用中解决了相同的情况。在你的情况下它看起来像这样:
定义委托协议。
protocol CategorySelectionDelegate: class {
func categorySelected(category: String)
}
在类别视图控制器(vc1)中定义委托变量。
var categorySelectionDelegate: CategorySelectionDelegate?
在类别视图控制器(vc1)中,选择表格行时,触发委托,传递类别名称。
//get the category name from your model, based on the row selected...
//call the delegate, passing the category name
categorySelectionDelegate?.categorySelected(category)
将协议添加到主控制器(vc2)。
class vc2: UIViewController, CategorySelectionDelegate
在主视图控制器(vc2)中,将其设置为类别视图控制器(vc1)的委托。
vc1.categorySelectionDelegate = self
在主控制器中实施协议。
func categorySelected(category: String) {
//display the items for this category in vc3
}
答案 1 :(得分:1)
经过更多的研究和文献阅读后,我解决了我的问题。以下是可能遇到类似问题的任何人遇到问题的步骤。
1.set容器场景嵌入segue标识符
2.在主VC中创建容器视图的实例(此问题的VC2)
3.在主VC(在我的情况下是VC 2)中,使用prepare for segue方法设置在VC2中创建的实例。
4.设置任何可能需要设置的变量
5.确保从容器场景中的表视图创建一个IB出口到您的代码并将其设置为数据源。