如何防止UINavigation栏上同时按钮触摸的双重操作?

时间:2015-11-04 22:21:19

标签: ios objective-c uinavigationcontroller uinavigationbar uinavigationitem

在UINavigation栏中,左侧UIBarButtonItem中有一个右侧自定义共享UIBarButtonItem和一个后退按钮。当同时点击两个按钮时,应用程序会产生黑色视图,可能是因为两个按钮都试图同时显示新视图 - 分享按钮显示UIActivityViewController,后退按钮显示前一个屏幕中的VC。

在这里查看类似的问题时,我尝试了以下解决方案,但都没有阻止黑色视图出现在同时按键触摸上:

  1. 以下列两种方式将exclusiveTouch插入ViewDidLoad
  2.   

    A)   for(UIView *temp in self.navigationController.navigationBar.subviews) { [temp setExclusiveTouch:YES]; }

         

    b)[self.navigationController.navigationBar setExclusiveTouch:YES];

    1. 触摸后应用self.navigationController.navigationBar.userInteractionEnabled = NO;
    2. 还有其他解决方案吗?

      这与多线程有关吗?

3 个答案:

答案 0 :(得分:1)

在每个触摸事件处理程序中,添加以下行:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

处理程序完成后,执行以下命令:

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

由您决定如何考虑处理程序的结束。如果您正在推送或弹出视图控制器,则可以将第二行添加到相关视图控制器的viewWillAppear。如果您正在显示模态视图控制器,则可以使用-[UIViewController presentViewController:animated:completion:]的完成处理程序。

答案 1 :(得分:1)

非常简单,你可以在这种情况下使用ExclusiveTouch属性

  

[self.navigationController.navigationBar setExclusiveTouch:YES];

这是一个布尔值,指示接收器是否专门处理触摸事件。

将此属性设置为YES会导致接收方阻止将触摸事件传递到同一窗口中的其他视图。此属性的默认值为NO。

答案 2 :(得分:0)

如果一次只需要一个按钮来响应触摸,则需要为该按钮设置exclusiveTouch,而不是父视图。

在添加条形按钮项后立即放置。

for(UIView *temp in self.navigationController.navigationBar.subviews)
{
    [temp setExclusiveTouch:YES];
}

或者您可以在创建exclusiveTouch时为每个UIBarButton单独设置public class Individual { public virtual int Sid { get; set;} public virtual string Id { get; set; } public virtual string FirstName { get; set; } public virtual string LastName { get; set; } public virtual string MiddleInitial { get; set; } public virtual ISet<Company> Companies { get; set; } } public class Company { private bool _inactive; public virtual int Sid { get; set; } public virtual string Name { get; set; } public virtual IList<Individual> Individuals { get; set; } public virtual bool Active { get { return !_inactive; } set { _inactive = value; } } public virtual bool IsVendor { get; set; } } public class IndividualCompany { public virtual Individual Individual { get; set; } public virtual Company Company { get; set; } public override bool Equals(object obj) { if (obj == null) return false; IndividualCompany key = obj as IndividualCompany; if (key == null) return false; if (Individual.Sid == key.Individual.Sid && Company.Sid == key.Company.Sid) return true; return false; } public override int GetHashCode() { int hash = 13; hash = 7 * hash * Individual.Sid.GetHashCode(); hash = 7 * hash * Company.Sid.GetHashCode(); return hash; } }