Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.08k stars 1.38k forks source link

配置表 NeedsBackBarButtonItemTitle、backBarButtonItemTitleWithPreviousViewController: 与系统的 backBarButtonItem 三者互相冲突 #1130

Closed MoLice closed 3 years ago

MoLice commented 3 years ago

Bug 表现 在 QMUI 体系里总共有3种方式可以控制返回按钮的文字:

  1. 配置表 NeedsBackBarButtonItemTitle,可以全局屏蔽返回按钮的文字。
  2. -[QMUINavigationControllerAppearanceDelegate backBarButtonItemTitleWithPreviousViewController:] 方法可以控制当前界面的返回按钮文字。
  3. 系统的 UINavigationItem.backBarButtonItem,可以控制当前界面的下一个界面的返回按钮文字。

这3种方式的优先级目前比较混乱,导致某些场景需求无法实现:

  1. 全局默认不显示返回按钮文字,但某个界面的子界面强制要求显示返回按钮文字。

    这种直观反应是将配置表的 NeedsBackBarButtonItemTitle 设为 NO,再设置指定界面的 backBarButtonItem,但会发现子界面依然没有返回按钮文字,因为在 push 界面时,为了应用 NeedsBackBarButtonItemTitle 配置项,QMUI 又会重新设置 backBarButtonItem 的值,导致覆盖了业务自己设置的值。

  2. 某个界面的子界面强制要求显示返回按钮文字,但其中某一个子界面又不希望显示返回按钮文字。

    直观反应是给父界面设置 backBarButtonItem,不希望显示返回按钮文字的子界面则再实现 backBarButtonItemTitleWithPreviousViewController: 方法返回一个空字符串,这样后者可以在 push 的时候把 backBarButtonItem 重置为空。一般情况下没问题,但如果父界面的 backBarButtonItem 随时可能被设置(例如在某个 notification callback 里去设置),那么 backBarButtonItemTitleWithPreviousViewController: 的值又会被覆盖,于是子界面又看到返回按钮文字。

预期的表现

这3种方法,按照优先级从低到高排列应该是:NeedsBackBarButtonItemTitle < backBarButtonItem < backBarButtonItemTitleWithPreviousViewController:,优先级高的方式可以覆盖优先级低的方式,同时要保证不会因为时机问题而导致低优先级的方式覆盖了高优先级的方式。

其他信息

MoLice commented 3 years ago

已发布 4.2.2 修复该问题。