Xcode 14.3构建的iOS应用崩溃:无法在UINavigationBar上手动设置委托

iqxoj9l9  于 2023-05-19  发布在  iOS
关注(0)|答案(1)|浏览(263)

我有一个iOS App。最近,我更新了我的Xcode到14.3版本。我的iOS在开始时就崩溃了。以下是异常错误消息:

Cannot manually set the delegate on a UINavigationBar managed by a controller.

这在以前的Xcode 14.1中没有发生。
我使用故事板来设置应用程序的UI。下面是我的应用程序中定义的入口:

在我的app info plist文件中,我将故事板的入口设置为MainStoryboard

通过这种方式,我不需要在AppDelegate类中指定要加载哪个视图控制器作为初始起点。
MainStoryboard.storyboard中的根视图控制器是一个具有3个选项卡的选项卡视图控制器,指向其他3个故事板引用。根视图控制器基于自定义类:

class RootViewController: UITabBarController {
    ....
}

其中三个选项卡设置有标题和图像。我试图在viewLoaded事件中设置一个断点,但在到达我的代码之前发生了崩溃。
在我的iOS项目中,我找不到任何地方在这个故事板或我的自定义类中手动设置UINavigationBar上的委托。根视图控制器中根本没有导航控制器。
根本没有任何编译警告或错误。我不知道为什么在到达我的iOS代码之前会引发异常。我的iOS项目中是否有任何属性设置,或者我的MainStoryboard.storyboard中是否有任何设置导致了错误?Xcode 14.3中有什么重大的变化或规则我应该遵守吗?
奇怪的是,如果我回滚到Xcode 14.1,即以前的版本,我的应用程序编译和运行良好。
我非常感谢任何帮助或建议来解决这个问题。

lnlaulya

lnlaulya1#

感谢neklasGeoff-Hackworth的2条评论。根据他们的建议,我进一步调查了这个问题。
首先,我在AppDelegate中添加了一些代码来启动我的start view控制器,如下所示:

@UIApplicationMain
class AppDelegate : UIResponder, UIApplicationDelegate {

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)
    -> Bool
  {
    // Set break point here
    let mainStoryboard : UIStoryboard = UIStoryboard(
        name: "MainStoryboard",
        bundle: nil)
    let initialVC : UIViewController?
      = mainStoryboard.instantiateInitialViewController()!
    // Exception raised at the above line!
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = initialVC!
    self.window?.makeKeyAndVisible()
    
    return true
  }
}

并删除了项目中我的应用程序信息plist文件中的“主情节提要文件库名称”行。通过这些更改,我可以让应用程序在我的项目中的代码处停止。正如上面代码中的注解,我得到了关于“Cannot manually set the delegate on a UINavigationBar managed by a control”的相同异常。
我继续追查我的其他三个故事板。在脚本中,在开始视图控制器之前有三个导航控制器(链接到3个脚本引用)。在故事板中,我确实看到导航栏和导航控制器之间有一个链接设置,如图所示。

在最后一个更改步骤中,我删除了这个链接,以及另外两个故事板中的相同链接。
就是这样!在重新编译我的iOS应用程序后,应用程序可以启动,没有更多的错误!
我认为在第一个选项卡视图控制器启动时,运行时引擎会检查链接的选项卡视图(所有视图控制器)。如果在故事板或代码中定义了任何导航栏委托,新的Xcode 14.3将抛出异常错误。
在我的项目中,这是一个很难发现的问题,至少对我来说是这样。
干杯!现在我可以继续使用Xcode 14.3工具更新我的iOS应用程序了。再次感谢这两个人给我提示,找到并解决我的问题。

关于我的进一步发现的更多信息

我将以下代码放入一个视图控制器中,以了解导航栏委托的设置:

override func viewDidLoad()
{
    super.viewDidLoad()
    let dl = navigationController?.navigationBar.delegate
    if let dl = dl {
        print("nv: \(navigationController)\nnv bar delegate: \(dl)")
    }

调试打印结果:

nv: <UINavigationController: 0x10a822600>
nv bar delegate: <UINavigationController: 0x10a822600>

它确认已将代理设置为导航控制器。但是,这个设置不能重复进行或更改,无论是在故事板中还是在Xcode 14.3中编译目标的代码中。
我还检查了以前的Xcode 14.1。这些更改不会影响我的应用的正常启动。

相关问题