简体   繁体   中英

Not able to add back button to swift navigation controller

I have issue where my app has a screen that scans a UPC code and shows the product detail screen if a match found, however the screen shows up as a modal and there is no back button, it looks like this and if I make it full screen you can't leave this screen.

Screen without back button

Here is it looks when accessing via the search screen

Here is how it should look with back button

Here is the code I'm using the present the product detail screen:

func launchApp(decodedURL: String) {
    
    if presentedViewController != nil {
        return
    }
    
    let decodedUPC = Int(decodedURL)
    
    guard let goodProduct = ProductsProvider().queryUPC(upcNumber: decodedUPC!) else  {
        
        let alertController = UIAlertController(title: "UPC Code not found \(String(describing: decodedUPC))", message: "We could not find this item, please use our search", preferredStyle: .alert)
        
        let confirmAction = UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: { (action) -> Void in
            
            // Code here
            self.dismiss(animated: true, completion: nil)
            
        })
        
        alertController.addAction(confirmAction)
        
        present(alertController, animated: true, completion: nil)
        return
        
    }
            

    let viewController:
        ProductDetailView = UIStoryboard(
            name: "Main", bundle: Bundle(for: ProductDetailView.self)
            ).instantiateViewController(withIdentifier: "productDetailViewController") as! ProductDetailView
    
    viewController.productDetail = goodProduct
    viewController.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
    viewController.navigationItem.leftItemsSupplementBackButton = true
    
    
    let navigationController = UINavigationController(rootViewController: viewController)
    // navigationController.modalPresentationStyle = .fullScreen

    

    self.present(navigationController, animated: false, completion: nil)
    
}

Any help to get the back button on the screen would be greatly appreciated

You can use pushViewController approach instead of present:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "identifier_of_target_vc") as! ClassNameofTargetVC 
self.navigationController?.pushViewController(nextViewController, animated:true)

Hope this helps!

#Method 1

From Apple documentation regarding to pushViewController(_:animated:) Link :

In addition to displaying the view associated with the new view controller at the top of the stack, this method also updates the navigation bar and tool bar accordingly.

To update your navigation bar and tool bar in order to show the back button you should push the viewController from your existing navigation controller:

self.navigationController?.pushViewController(viewController, animated: false)

instead of:

let navigationController = UINavigationController(rootViewController: viewController)
self.present(navigationController, animated: false, completion: nil)

#Method 2

To dismiss a full screen presented ViewController simply add a UIBarButtonItem to the navigationItem:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Presented View"

        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAction))
    }

    @objc func cancelAction() {
        dismiss(animated: true)
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM