VC 使用 self.present 调用时不显示 navigationItem

Posted

技术标签:

【中文标题】VC 使用 self.present 调用时不显示 navigationItem【英文标题】:navigationItem not displayed when VC called with self.present 【发布时间】:2018-05-05 12:27:52 【问题描述】:

需要帮助,因为我现在正在苦苦挣扎几天......

我有一个带有从 viewDiDLoad 调用的导航项的 VC:

override func viewDidLoad() 
    super.viewDidLoad()
    self.customization()
    self.fetchData()

...

func customization() 
        self.navigationItem.title = self.currentUser?.displayName
    self.navigationItem.setHidesBackButton(true, animated: false)
    let icon = UIImage.init(named: "back")?.withRenderingMode(.alwaysTemplate)
    let backButton = UIBarButtonItem.init(image: icon!, style: .plain, target: self, action: #selector(self.dismissSelf))
    backButton.tintColor = UIColor(red: 0.0157, green: 0.498, blue: 0, alpha: 1.0)
    self.navigationItem.leftBarButtonItem = backButton
    self.locationManager.delegate = self
    print("called customization()")

当使用触发的 segue Show 调用时,它可以完美运行,没有任何问题。

当我使用以下内容调用 VC 时:

    let storyBoard: UIStoryboard = UIStoryboard(name: "Storyboard", bundle: nil)
    let viewController = storyBoard.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
self.present(viewController, animated: true, completion: nil)

我得到了从控制台访问 viewDidLoad 和自定义()的方法:

called customization() 

但没有显示导航项。

试图从调用方法中复制customization()中的方法,它们被执行但也没有显示。

知道这里有什么问题吗?

【问题讨论】:

【参考方案1】:

演示时必须添加导航:

let storyBoard: UIStoryboard = UIStoryboard(name: "Storyboard", bundle: nil)
let viewController = storyBoard.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
let nav = UINavigationController(rootViewController: viewController)
self.present(nav, animated: true, completion: nil)

【讨论】:

这很有效。您能否添加一个简短的解释,为什么这是必要的,因为我在其他 VC 中没有必要。谢谢! 当你要推送视图控制器时,你需要导航控制器来推送 VC。所以导航自动嵌入推送。当我们要展示视图控制器时,我们必须用 self(controller) 来展示它,而不是导航控制器,所以我们需要将此导航控制器嵌入到展示的 VC 中。 developer.apple.com/library/content/featuredarticles/… 完美!谢谢。现在最后一件事。如果我尝试关闭用您的代码调用的 SecondVC,它什么也不做。要关闭它,我使用: navController.popViewController(animated: true) 。如果我改用 self.dismiss 它会崩溃,有什么想法吗? 你必须像这样关闭视图控制器:self.dismiss(animated: true, completion: nil) Pop 将与 push 一起使用,dismiss 将与 present 一起使用

以上是关于VC 使用 self.present 调用时不显示 navigationItem的主要内容,如果未能解决你的问题,请参考以下文章

VC++对话框里新添加的控件运行时不显示

使用 Swift 3 'self.present' 呈现一个新的视图控制器

为啥我们需要调用主线程进行 UI 更新?

nmake / VC++ 2010:编译时不依赖 MSVCR100.dll

调用 API 时不显示 UICollectionView 单元格

关闭模态表单时不调用方法 Dipose