Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 11首选目标在滚动之前不显示_Ios_Swift_Uitableview_Uinavigationcontroller_Uikit - Fatal编程技术网

iOS 11首选目标在滚动之前不显示

iOS 11首选目标在滚动之前不显示,ios,swift,uitableview,uinavigationcontroller,uikit,Ios,Swift,Uitableview,Uinavigationcontroller,Uikit,我在使用表视图控制器时遇到了iOS 11大标题的问题 我已在viewDidLoad中将首选目标设置为true: override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.prefersLargeTitles = true } 运行我的应用程序时,标题显示为prefersLargeTitles设置为小,但如果我向下滚动,则会显示大标题 我有两个uiviewcontr

我在使用表视图控制器时遇到了iOS 11大标题的问题

我已在viewDidLoad中将
首选目标设置为true:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
}
运行我的应用程序时,标题显示为
prefersLargeTitles
设置为小,但如果我向下滚动,则会显示大标题

我有两个
uiviewcontroller
,它们都正确地显示了大标题,并在
UITableViewController
栏上显示

我在代码和情节提要中尝试了将
首选目标设置为true的不同组合,您可以将
大标题设置为
自动
始终
从不

我只能找到另一个关于堆栈溢出的问题,它涉及到这个确切的问题,但没有一个答案能够解决它


遇到此问题的其他人是否能够解决此问题?

您需要在导航控制器上启用大标题。很难找到,所以请看下面的截图。

如果您的表视图控制器继续连接到其他细节视图控制器,则应在这些其他视图控制器的故事板中将
大标题
设置为
从不

不要在这样的代码中乱用
prefersLargeTitles

      self.navigationController?.navigationBar.prefersLargeTitles = false

设置
preferslargetiles
后,可以通过在UITableView上调用setContentOffset来触发显示大标题

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
    self.tableView.setContentOffset(CGPoint(x: 0, y: -1), animated: true)
}

可能是在
viewdiload
之前重新加载
tableView
?我今天也观察到了同样的行为。在我的例子中,我在一个变量上设置了一个
didSet
,该变量在
viewDidLoad
之前被设置为
tableView.reloadData

我可以通过添加一个保护来解决这个问题,因此
重新加载数据
只在变量以前不是
nil
时发生,这意味着是第一次

这是我的呼叫课程供参考

/// Master Controller in UISplitViewController
class MyMasterViewController: UIViewController {

  private let controller = MyTableViewController()

  override func viewDidLoad() {
    super.viewDidLoad()

    controller.instanceVariable = data
    showDetailViewController(navigationController, sender: self)
  }

...

  private func reloadDetail() {
    controller.instanceVariable = newData
  }
}
下面是修复程序-在下面添加了
guard
语句

/// Detail Controller in UISplitViewController
class MyTableViewController: UITableViewController {

  var instanceVariable: MyData! {
    didSet {
      guard oldValue != nil else { return }
      tableView.reloadData()
    }
  }

  // UITableViewController Methods...
}

希望这有帮助!如果我的示例没有意义,我建议注释掉对
tableView.reloadData
的所有引用,然后在确保它们在
tableView
最初加载之后才被调用时才重新添加。这解决了我几个月来一直遇到的问题。在我的例子中,我在didSet块中设置了表视图数据源,它生成了您描述的确切行为。谢谢!这是唯一对我有效的解决方案!