2014-11-20 1 views
0

navController에 포함 된 mapViewController가있는 앱이 있습니다. mapVC ive에서 단일 막대 버튼 항목을 가져 왔는데이 버튼을 클릭하면 여러 뷰 컨트롤러 중 하나에 조건부로 "밀어 넣기"를 원합니다. 그 버튼에 IBAction를 설정하고Swift - 분할 된 컨트롤을 사용하여 다른보기 컨트롤러로 이동

@IBAction func addButtonClicked(sender: UIBarButtonItem) { 
    let lastAdd = "addItem" 
    if lastAdd == "addItem"{ 
     self.performSegueWithIdentifier("addItem", sender: self) 
    } else { 
     self.performSegueWithIdentifier("addEvent", sender: self) 

    } 
} 

즉, 해당 버튼 IBAction를 방법의 조건 "performSegueWithIdentifier"코드가 필자 달성하기 위해이 나에게 addItemVC 또는 addEventVC 하나가 소요됩니다. 그 viewController (즉, addItemVC 및 addEventVC) 각각에서, 클릭 할 때 addItemVC가 현재 표시되어있는 경우 즉, 세그먼트 화 된 addEvent 섹션이 나올 때 대체 VC로 이동하게되는 탐색 막대에 세그먼트 컨트롤이 있어야합니다. 컨트롤을 클릭하면 addEventVC가 표시됩니다. 그 다음에는 Red Artisans page을 수행하는 방법을 따르지만 그의 예에서는 모든 뷰 컨트롤러 옵션을 앱 델리게이트에서 미리 인스턴스화하므로 각보기 컨트롤러에 대한 참조를 쉽게 가져올 수 있으며 rootVC 내 세그먼트 컨트롤의 클릭 된 세그먼트에 연결할 수 있습니다

메신저는 혼란 스럽습니다. 각각의 segue를 수행하기 전에 조건 코드를 사용하여 Im을 보았습니다. 나는 바 버튼 항목을 눌렀을 때 한 번에 하나의 viewController 인스턴스를 생성한다고 가정합니다. 그렇다면 VC에 전달할 View Controller 배열을 가져와 VC에서 필요한 분할 컨트롤을 만들 수 있도록하는 방법은 무엇입니까? 수동으로 대상 VC 배열을 내 mapViewController 생성 할 수 및 이러한 통과하지만 그 인스턴트 메신저 프로세스에 의해 자동으로 만든 인스턴스를 다른 인스턴스 instatiating wouldnt 가정합니다.

답변

1

네, 그렇습니다. mapViewController에 두 개의 VC를 수동으로 생성하면, 세그먼트에 의해 생성 된 인스턴스와는 다른 인스턴스가됩니다. Red Artisan의 솔루션을 계속 사용하려면 코드보다는 코드를 사용하십시오. 스토리 보드에 두 개의 VC를 디자인하고 각자 고유 한 식별자를 부여한 다음 self.storyboard의 기능을 사용하여 인스턴스를 생성 할 수 있습니다.

Red Artisan의 대부분의 앱 대리인 코드는 mapViewController에서 사용할 수 있지만 몇 가지 조정할 수 있습니다. 예 : mapViewController가 포함 된 기존 탐색 컨트롤러를 사용하려면 [window ...] 행이 불필요합니다. 조심해야 할 것은 indexDidChangeForSegmentedControl 함수입니다. 전환하는 VC가 네비게이션 컨트롤러의 rootViewController (즉, 네비게이션 컨트롤러의 viewControllers 배열의 유일한 항목 임)라고 가정합니다. 귀하의 경우에는 mapViewController를 rootViewController로 가지고 있으므로 indexDidChangeForSegmentedControl 함수를 수정하여 인덱스 0에 mapViewController 배열을 만들고 인덱스 1에 관련 VC (addItem 또는 addEvent) VC를 배열로 만들면됩니다. 이 메소드가 얼마나 잘 작동하는지, 뒤로 버튼 등이 제대로 설정되는지 여부를 확인하십시오.

만약 당신이 segues를 고집하고 싶다면, 두 가지 해결책이 있습니다 : 하나는 UITabBarController을 사용하고 (tabbar를 숨기는 것입니다). addItem 및 addEvent VC를 별도의 탭으로 사용하고 tabBarController를 선택하면 어떤 탭이 선택 될지 설정할 수 있습니다. 하지만 내 선호하는 솔루션은 UIPageViewController으로 갈아 입을 것입니다. mapViewController에서 VC를 생성하고이를 segue의 일부로 전달하거나, 어느 것이 선택되었는지에 대한 표시기를 전달하고 pageViewController가 인스턴스를 생성하여 관련 인스턴스를 제시하도록 할 수 있습니다. 그런 다음 UISegmentedControl을 사용하여 VC 간 전환을 트리거 할 수 있습니다. 유사한 내용은 this answer을 참조하십시오.

0

감사합니다. 자세한 지침은 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 메소드에는 완료 핸들러가있는 것으로 보입니다. 제안 사항이 있으십니까?

관련 문제