development

NavigationViewController 신속한 ViewController 제공

big-blog 2020. 12. 27. 20:39
반응형

NavigationViewController 신속한 ViewController 제공


"NavigationViewController-> MyViewController"시스템이 있고 프로그래밍 방식으로 MyViewController를 세 번째 뷰 컨트롤러 내에 표시하고 싶습니다. 문제는 MyViewController에 내비게이션 바가 없다는 것입니다. 도와주세요?

var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("MyViewController") as ViewController
self.presentViewController(VC1, animated:true, completion: nil)

호출 은 기존 탐색 스택 외부에 모달로presentViewController 뷰 컨트롤러를 표시합니다 . UINavigationController 또는 기타에 포함되지 않습니다. 새 뷰 컨트롤러에 내비게이션 바를 포함하려면 두 가지 기본 옵션이 있습니다.

옵션 1. 새보기 컨트롤러를 모달로 표시하는 대신 기존 탐색 스택에 푸시합니다.

let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
self.navigationController!.pushViewController(VC1, animated: true)

옵션 2. 새 뷰 컨트롤러를 새 탐색 컨트롤러에 포함하고 새 탐색 컨트롤러를 모달로 표시합니다.

let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1) // Creating a navigation controller with VC1 at the root of the navigation stack.
self.present(navController, animated:true, completion: nil)

이 옵션은 "뒤로"버튼을 자동으로 포함하지 않습니다. 긴밀한 메커니즘을 직접 구축해야합니다.

당신에게 가장 적합한 것은 휴먼 인터페이스 디자인 질문이지만 일반적으로 무엇이 가장 합리적인지는 분명합니다.


SWIFT 3

let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)

내 탐색 막대가 표시되지 않아 Swift 2 iOS 9에서 다음 방법을 사용했습니다.

let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("Dashboard") as! Dashboard

// Creating a navigation controller with viewController at the root of the navigation stack.
let navController = UINavigationController(rootViewController: viewController)
self.presentViewController(navController, animated:true, completion: nil)

UIViewController에 대한 확장과 구조체를 사용하여 현재보기가 즐겨 찾기에서 표시되는지 확인했습니다.

1. 글로벌 Bool의 구조

struct PresentedFromFavourites {
static var comingFromFav = false}

2. UIVeiwController 확장 : "stefandouganhyde-옵션 2"에 의해 두 번째 옵션에서와 같이 모달로 표시되고 뒤 해결

extension UIViewController {
func returnToFavourites()
{
    // you return to the storyboard wanted by changing the name
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    let mainNavigationController = storyBoard.instantiateViewController(withIdentifier: "HomeNav") as! UINavigationController
    // Set animated to false
    let favViewController = storyBoard.instantiateViewController(withIdentifier: "Favourites")
    self.present(mainNavigationController, animated: false, completion: {
        mainNavigationController.pushViewController(favViewController, animated: false)
    })

}
// call this function in viewDidLoad()
// 
func addBackToFavouritesButton()
{
    if PresentedFromFavourites.comingFromFav
    {
        //Create a button
        // I found this good for most size classes
        let buttonHeight = (self.navigationController?.navigationBar.frame.size.height)! - 15
        let rect = CGRect(x: 2, y: 8, width: buttonHeight, height: buttonHeight)
        let aButton = UIButton(frame: rect)
        // Down a back arrow image from icon8 for free and add it to your image assets  
        aButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
        aButton.backgroundColor = UIColor.clear
        aButton.addTarget(self, action:#selector(self.returnToFavourites), for: .touchUpInside)
        self.navigationController?.navigationBar.addSubview(aButton)
        PresentedFromFavourites.comingFromFav = false
    }

}}

받아 들여지는 대답은 훌륭합니다. 이것은 대답이 아니라 문제의 예시 일뿐입니다.

다음과 같은 viewController를 제시합니다.

vc1 내부 :

func showVC2() {
    if let navController = self.navigationController{
        navController.present(vc2, animated: true)
    }
}

vc2 내부 :

func returnFromVC2() {
    if let navController = self.navigationController {
        navController.popViewController(animated: true)
    }else{
        print("navigationController is nil") <-- I was reaching here!
    }
}

As 'stefandouganhyde' has said: "it is not contained by your UINavigationController or any other"

new solution:

func returnFromVC2() {
    dismiss(animated: true, completion: nil)
}

ReferenceURL : https://stackoverflow.com/questions/25444213/presenting-viewcontroller-with-navigationviewcontroller-swift

반응형