NavigationController中的视图之间的排序无法正常运行

时间:2019-01-20 21:02:58

标签: ios swift uinavigationcontroller navigation uinavigationbar

我有一个包含设置视图的应用程序,该视图使用带有原型单元的UITableView进行设置。填充后,每个单元格都将转到后续的设置页面。然后,这些后续设置页面应允许用户导航回到主设置页面(并最终退出设置返回主菜单)。

每个设置页面的基础机制均正常运行。我遇到的问题是将所有这些都捆绑在导航流中。

第一种方法

最初,我已经将设置屏幕编码为许多不同的视图控制器,并从主设置屏幕为每个视图控制器创建了手动序列(然后手动将序列创建回了主设置屏幕)。主要设置屏幕本质上是带有原型单元格的可视化自定义UITableView。这种方法可以按预期工作,但由于需要在每个屏幕上手动编码每个序列而非常笨拙。

新方法(无效)

为了使内容更整洁和易于管理(按代码进行),我尝试使用导航控制器将主要设置页面嵌入到导航控制器中来达到相同的效果(这可能不是正确的术语,但实际上,主要设置页面是通过导航控制器进入情节提要时看到的内容。从那里,我使用segues将主要设置页面连接到每个辅助设置页面。

使用导航控制器方法,主设置页面可以正确加载并正常工作(即:正确的内容加载,表滚动,开关正常工作等),但是每当轻按一个单元格时,都应调用segue来辅助设置页面,似乎什么都没有发生……但是,我可以看到所选辅助设置页面的打印行已经运行,并且主设置页面冻结并无法使用。

主要设置屏幕的简单演示,导致下一个屏幕:https://imgur.com/qnzb36j.png

关键字标识符和详细信息: https://imgur.com/W3Gn7WS.png

在主设置屏幕中使用以下代码来启动到“计时器”屏幕的检测(例如)。计时器屏幕的标识为“ ShowTimerView”。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        print("\(indexPath.row) was selected.")

        if indexPath.row == 1 {
            // Action when timer button pressed
            print("Timer button pressed.")
            print("-----Segueing to Timer view.")
            self.performSegue(withIdentifier: "ShowTimerView", sender: nil)
        }
}

如前所述,在计时器单元上点击以导航至“计时器”屏幕将导致主设置屏幕无响应,并且“计时器”屏幕永不出现。我可以说出计时器屏幕已加载/运行为计时器页面的ViewController运行中的打印行,并显示在终端中。

我尝试过各种各样的事情来使其正常工作。我认为我正在犯一个愚蠢的错误,因为当我将“ segue”类型从“ Show”更改为“ Present Modally”时,Timer屏幕会加载并出现...但是导航栏无法加载,因此无法导航回到主设置屏幕。

作为参考,从主菜单导航到主设置屏幕时,我确实获得以下终端输出...不确定是否对确定问题有任何帮助:

Settings button pressed.
-----Segueing to Settings view.
2019-01-20 20:54:58.979042+0000 ThirtySeconds[14618:388866] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600001f68690 UILabel:0x7fb2a1d636b0'Settings'.top >= UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top   (active)>",
    "<NSLayoutConstraint:0x600001f685a0 UILabel:0x7fb2a1d636b0'Settings'.firstBaseline == UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top + 28   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001f68690 UILabel:0x7fb2a1d636b0'Settings'.top >= UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

然后按一下Timer单元格,将显示以下输出:

Timer button pressed.
-----Segueing to Timer view.
2019-01-20 20:55:38.339771+0000 ThirtySeconds[14618:388866] [Answers] Logging Answers event: <ANSPredefinedEvent: content_view
{
    "content_id" = "N/A";
    "content_name" = Timer;
    "content_type" = "Settings Screen";
}
{
}>
2019-01-20 20:55:38.359086+0000 ThirtySeconds[14618:389499] [Answers] Logging predefined event to Firebase. <select_content
{
    "content_type" = "Settings Screen";
    "item_id" = "N/A";
    "item_name" = Timer;
}>
2019-01-20 20:55:38.365187+0000 ThirtySeconds[14618:388866] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600001f6ab20 UILabel:0x7fb2a1d73f60'Timer'.top >= UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top   (active)>",
    "<NSLayoutConstraint:0x600001f6a850 UILabel:0x7fb2a1d73f60'Timer'.firstBaseline == UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top + 28   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001f6ab20 UILabel:0x7fb2a1d73f60'Timer'.top >= UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

1 个答案:

答案 0 :(得分:0)

啊!原来的问题是我在子类导航控制器中进行的高度修改。删除此修改将使所有内容按预期运行和运行。