感谢 pbasdf 的详细说明。它花了我一段时间,但我似乎接近让它工作了。我遵循了您的大部分指示,并且您对您所说的话很了解。
首先从 mapVC 中按下 + 栏按钮项,我使用 instantiateViewControllerWithIdentifier 创建 addItem 和 addEvent VC,并创建分段控件。
@IBAction func addButtonClicked(sender: UIBarButtonItem) {
//at this stage just manually set default target VC
let lastAdd = "addItem"
//get an array of the target viewcontrollers
var viewControllers = segmentViewControllers()
//initz the segmentscontoller with the current navcontroller if doesnt already exist
if segmentsController == nil {
segmentsController = SegmentsController(navController: self.navigationController!, viewControllers: viewControllers)
segmentedControl.addTarget(segmentsController, action: "indexDidChangeForSegmentControl:", forControlEvents: UIControlEvents.ValueChanged)
//add the segmented control to the VC by setting first user experience which calls indexdidchangeforsegmentedcontrol
firstUserExperience()
}
segmentsController?.indexDidChangeForSegmentControl(segmentedControl)
}
//create an array of the target view controller. called from addbutton clicked
func segmentViewControllers() -> [UIViewController] {
//create an instance of the viewcontrollers
let addItemVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("AddItemVC") as ViewController
let addEventVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("AddEventVC") as ViewController
var viewControllers = [addItemVC, addEventVC]
return viewControllers
}
在segmentsController 中,我创建了2 个数组,1 个用来保存不同的VC,1 个用来保存导航堆栈。我还将传递的分段控制设置给传入的 VC
class SegmentsController: NSObject {
var navController: UINavigationController?
var viewControllersOptionsArray: [UIViewController] = []
var viewControllersNavArray: [UIViewController] = []
//MARK: - INITIALIZER
init(navController: UINavigationController, viewControllers: [UIViewController]) {
self.navController = navController
self.viewControllersOptionsArray = viewControllers
}
//MARK: SEGMENT INDEX METHOD
func indexDidChangeForSegmentControl(segmentedControl: UISegmentedControl) {
var index = segmentedControl.selectedSegmentIndex
var incomingViewController = viewControllersOptionsArray[index]
//set the viewControllersNavArray
if let mapVC = navController?.viewControllers[0] as? MapViewController {
viewControllersNavArray = [mapVC, incomingViewController]
}
//set the navcontroller with a new array of viewcontrollers
navController?.setViewControllers(viewControllersNavArray, animated: true)
//set the title of the incoming view controller
incomingViewController.navigationItem.titleView = segmentedControl
//set the seg control variable of the incoming VCs
if let iVC = incomingViewController as? AddItemViewController {
iVC.segmentedControl = segmentedControl
} else if let iVC = incomingViewController as? AddEventViewController {
iVC.segmentedControl = segmentedControl
}
}
}
在 addItem 和 addEvent VC 中,我认为如果用户按下后退按钮,我需要将当前 selectedSegmentIndex 传递回 mapVC - 不确定如何执行此操作并最终使用我下载的名为 UIViewController+BackButtonHandler 的扩展来处理它。
我确信我的代码可以写得更好,但我唯一仍然遇到的问题是我希望 VC 转换具有动画效果。如果我在 navController?消失。它仍然在那里,所以我仍然可以导航,但你看不到它。我认为这与在视图正确加载之前设置它有关,但即使我将代码设置为即
incomingViewController.navigationItem.titleView = segmentedControl
在 viewDidLoad 或 viewDidAppear 的新顶级 VC 中,我仍然遇到同样的问题。我还认为如果我可以将incomingViewController.navigationItem.titleView = segmentedControl 代码放在完成块中,但setViewControllers 方法似乎没有完成处理程序,我可能能够修复它。
有什么建议吗?