【问题标题】:Navigation bar hidden after initialize ViewController with identifier使用标识符初始化 ViewController 后隐藏的导航栏
【发布时间】:2017-07-06 18:06:47
【问题描述】:

我正在最终在我的应用程序中进行聊天,但我仍然遇到这个问题。如您所见,我有一个 ChatListTableViewController,其中包含所有活动聊天的列表(图 1,左上角视图)。当我单击一个单元格时,我成功打开了 che ChatViewController,其导航栏显示与我聊天的人的姓名、后退箭头和用于删除聊天的垃圾桶按钮。但是,在 ChatListTableViewController 中,我有一个“+”按钮(图 1,左上角),它打开了 PopUpViewController:这个按钮允许您与从 TableView 中选择的用户开始新的聊天。从图 1 中可以看出,问题是当我单击 PopUpChatListViewController 中的一个单元格时,我尝试初始化一个 ChatViewController,它会打开,但 NavigationBar 是隐藏的。这是通过使用 TableView 的函数“didSelectRowAt”完成的.我将 PopUpChatListViewController 的代码发布给您。在 ChatViewController 的 viewDidLoad 中,我尝试设置“navigationBar.isHidden = false”,但什么也没有。你能解释一下这里发生了什么吗?

import UIKit

class PopUpChatListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableView: UITableView!

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return userName.count
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellPopUp", for: indexPath)
        cell.textLabel?.text = userName[indexPath.row]
        return cell
    }

    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        UserDefaults.standard.set(userID[indexPath.row], forKey: "chatID")
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatActivity") as! ChatViewController
        self.present(vc, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

运行应用程序的屏幕截图视图:

主要故事板方案:

【问题讨论】:

  • 你能解释一下如何以适合容器的方式发布代码吗?我总是单击“{}”按钮并复制我看到的代码在此处输入您的代码,但我总是得到这个奇怪的结果。提前谢谢你们!

标签: swift chat navigationbar


【解决方案1】:

如果要使用push segue,请查看@Leo Valentim的答案。如果你仍然想使用modal segue,我的答案是给你的。

更改此代码:

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    UserDefaults.standard.set(userID[indexPath.row], forKey: "chatID")    

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatActivity") as! ChatViewController

    self.present(vc, animated: true, completion: nil)
}

收件人:

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    UserDefaults.standard.set(userID[indexPath.row], forKey: "chatID")    

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatActivity") as! ChatViewController
    let navigationController = UINavigationController()
    navigationController.viewControllers = [vc]

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

你可以参考这个问题:Modal segue, navigation bar disappears

这里:Using Segues(注意Table 9-1 Adaptive segue types,它包含了每个类型的segue类型和行为)

【讨论】:

  • 感谢您的回答。我听从了你的建议,现在出现了导航栏。问题是它没有返回箭头按钮,并且不允许用户返回聊天列表。我想避免使用 PRESENT MODALLY,但这是我发现显示此 PopUpTableView 的唯一方法。您是否建议我另一种解决方案,以便我的 NavBar 不会消失?
  • 这里有两个问题需要澄清。 1:你想从ChatListTableViewController(当前是modal segue)显示PopUpChatListViewController的什么样的segue?。 2:你想从PopUpChatListViewController(目前是modal segue)显示ChatViewController的什么样的segue?。
  • 返回按钮解释更多问题。 后退按钮 由导航控制器自动添加,用于从堆栈中移除最顶层的视图控制器并返回到前一屏幕。在我们的例子中,PopUpChatListViewController 对具有根视图的UINavigationController 执行segue 是ChatViewController。这意味着如果您正在显示ChatViewController 屏幕,后退按钮 将不会显示(因为在导航控制器的堆栈中,ChatViewController 后面根本没有视图控制器)。跨度>
  • 返回按钮解决问题。在ChatViewController 中,您可以将UIBarButtonItem 添加到导航栏。在该按钮的target(或IBAction,如果您使用.storyboard.xib 文件)中,只需添加以下代码:dismiss(animated: true, completion: nil)
  • 很好的解释。我只想根据用户在PopUpListViewController 中的选择实例化一个ChatViewController。特别是我不想用这个 ChatViewController 作为 root 创建一个新的 navigationController,因为这样我就不能导航回ChatListViewControlller,因为你上面解释的问题。我认为这里最好的选择是干预PopUpListViewController:您对如何创建类似的PopUpList 而不以模态方式呈现它有什么建议,以便在我能够推送ChatViewContr. 之后?
【解决方案2】:

替换

self.present(vc, animated: true, completion: nil)

self.navigationController?.pushViewController(vc, animated: true)

当您使用“呈现”时,视图会丢失导航控制器。

【讨论】:

  • 我认为这段代码行不通。解决方案是正确的,但在这种情况下,PopUpChatListViewController 没有UINavigationController,因为它由modal segue 显示。 i.stack.imgur.com/i3o5J.png
  • 感谢您的回答。我尝试使用 pushViewController,但没有 NavigationBar 得到相同的结果。我认为@TrungAnhPham 关于模态序列是正确的。但这是我发现显示这种类型的 PopUpTableView 的唯一方法,如图 1 所示。
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多