"Warning: Attempt to present * on * which is already presenting *" 的断点
Breakpoint for "Warning: Attempt to present * on * which is already presenting *"
有时我们想从代码的不同地方做 UIViewController.presentViewController(a, b, c)
,有时我们已经在演示了,在这种情况下我们得到:
Warning: Attempt to present * on * which is already presenting *
是否可以打破这个警告?如何为此设置断点?
首先,您需要将符号断点设置为-[UIViewController presentViewController:animated:completion:]
。您可以通过 Xcode 的 Add Symbolic Breakpoint
功能轻松添加。
其次,您需要设置一个条件,以便仅当视图控制器已经呈现某些内容时才命中断点。从程序上讲,这意味着 presentedViewController
属性 是非零的。这里的技巧是访问传递给任何方法调用的 self
隐式参数,这可以通过使用 $arg1
来完成(有关 here 的更多详细信息)。一旦你有了这个,剩下的就很简单了。
断点应如下所示:
(来源:cristik-test.info)
总结:
符号:-[UIViewController presentViewController:animated:completion:]
条件:[(UIViewController *)$arg1 presentedViewController] != nil
这适用于 Objective-C 和 Swift 项目,因为 UIViewController
(仍然)将其 public 方法导出为 Objective-C 符号。
有时我们想从代码的不同地方做 UIViewController.presentViewController(a, b, c)
,有时我们已经在演示了,在这种情况下我们得到:
Warning: Attempt to present * on * which is already presenting *
是否可以打破这个警告?如何为此设置断点?
首先,您需要将符号断点设置为-[UIViewController presentViewController:animated:completion:]
。您可以通过 Xcode 的 Add Symbolic Breakpoint
功能轻松添加。
其次,您需要设置一个条件,以便仅当视图控制器已经呈现某些内容时才命中断点。从程序上讲,这意味着 presentedViewController
属性 是非零的。这里的技巧是访问传递给任何方法调用的 self
隐式参数,这可以通过使用 $arg1
来完成(有关 here 的更多详细信息)。一旦你有了这个,剩下的就很简单了。
断点应如下所示:
(来源:cristik-test.info)
总结:
符号:-[UIViewController presentViewController:animated:completion:]
条件:[(UIViewController *)$arg1 presentedViewController] != nil
这适用于 Objective-C 和 Swift 项目,因为 UIViewController
(仍然)将其 public 方法导出为 Objective-C 符号。