감사합니다. 자세한 지침은 pbasdf를 참조하십시오. 그 날 꽤 오래 걸렸지 만, 나는 그것이 작동하도록 가까이있는 것 같다. 나는 대부분의 지시를 따랐고 당신이 말한 것과 함께 자리를 잡았습니다.
첫 번째 맵에서 + bar 버튼을 누르면 항목 I는 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 개는 탐색 스택을 유지하기 위해 만들었습니다. 나는 또한, 사용자가 백 버튼을 누를 때 난 mapVC 다시 현재 selectedSegmentIndex 전달할 필요 상상
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 벤처에서
수신 벤처로 전달 분할 제어를 설정 -이 작업을 수행하는 방법을 잘 모르겠다. UIViewController + BackButtonHandler라는 확장 기능을 사용하여 끝냈다.
확실히 내 코드는 훨씬 더 잘 작성 될 수 있지만 여전히 문제가있는 유일한 점은 VC 전환을 애니메이션으로 만들고 싶다는 것입니다. 내비게이션은 navController에서 false로 애니메이션을 설정하면 잘 작동하는 것처럼 보입니다. .setViewControllers (viewControllersNavArray, animated : true) 행을 true로 설정하면 segmentedControl이 들어오는 VC의 탐색 막대에서 모양을 잠깐 깜박입니다. 사라집니다. 아직도 그곳에는 여전히 탐색 할 수 있지만 볼 수는 없습니다. 내가보기가 제대로로드하기 전에 그것을 설정 함께 할 수있는 뭔가가 파악하지만 난 코드를 넣어 경우에도 난 여전히 같은 문제를 얻을 수있는 viewDidLoad 또는 viewDidAppear의 새로운 최고 VC에서 즉
incomingViewController.navigationItem.titleView = segmentedControl
그것을 설정 . 나는 또한 completeViewController.navigationItem.titleView = segmentedControl 코드를 완성 블록에 넣을 수 있지만 픽스 할 수 있다고 생각했는데 setViewControllers 메소드에는 완료 핸들러가있는 것으로 보입니다. 제안 사항이 있으십니까?