我正在使用UIWebView
并且不希望导航栏出现,除非用户点击屏幕上不是链接的任何地方。
所以我有这段代码在延迟后显示导航栏:
- (void)handleTapGesture:(UITapGestureRecognizer *)sender
{
....
[self performSelector:@selector(showNavigationBar) withObject:self afterDelay:0.2];
}
我在调用点击处理程序时没有立即调用showNavigationBar
,因为用户可能已经点击了链接,在这种情况下,点击处理程序在 UIWebView
之前被称为 shouldStartLoadWithRequest
,所以如果我隐藏shouldStartLoadWithRequest
中的导航栏,它会暂时闪现在屏幕上。
因此,我将其设置为在延迟后显示,以便在shouldStartLoadWithRequest
内为以下代码执行时间(如果用户未点击链接shouldStartLoadWithRequest
则未调用导航栏显示,就像在那种情况下一样)。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:nil];
...
然而,这不起作用,我已经将延迟时间增加到几秒钟,并且可以在显示导航栏之前确认cancelPreviousPerformRequestWithTarget
被调用,但是当指定的时间过去时,显示条形图。 cancelPreviousPerformRequestWithTarget
无效。
有人知道它为什么不起作用吗?
答案 0 :(得分:14)
您的演出与您的取消不符。在表演中,你将自己作为对象传递:
[self performSelector:@selector(showNavigationBar) withObject:self afterDelay:0.2];
在取消中你传递的是nil作为对象:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:nil];
它们不匹配,因此不应取消延迟执行。
答案 1 :(得分:11)
在+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
方法的documentation中有这句话:
此方法仅在当前运行循环中删除执行请求,而不是所有运行循环。
如果我正确解释它,则意味着您需要在启动它的同一个运行循环中取消操作。这显然不是你想要做的。
解决这个问题的一种方法是设置一个showNavigationBar
必须检查以查看是否应该继续或中止的标志。
答案 2 :(得分:3)
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showNavigationBar) object:self];
这对我有用;)
答案 3 :(得分:0)
不知道为什么,但对我来说却像个魅力。
var badData = FileSignatures.Drive.Public.Where(
e => (e.NetworkBlock?.Any(n => String.IsNullOrWhiteSpace(n.netId)) ?? false) &&
String.IsNullOrWhiteSpace(
e.WiFiBlock?.netId) &&
String.IsNullOrWhiteSpace(
e.BluetoothBlock?.netId))
.ToList();