在UINavigation栏中,左侧UIBarButtonItem中有一个右侧自定义共享UIBarButtonItem和一个后退按钮。当同时点击两个按钮时,应用程序会产生黑色视图,可能是因为两个按钮都试图同时显示新视图 - 分享按钮显示UIActivityViewController,后退按钮显示前一个屏幕中的VC。
在这里查看类似的问题时,我尝试了以下解决方案,但都没有阻止黑色视图出现在同时按键触摸上:
exclusiveTouch
插入ViewDidLoad A)
for(UIView *temp in self.navigationController.navigationBar.subviews) { [temp setExclusiveTouch:YES]; }
b)
[self.navigationController.navigationBar setExclusiveTouch:YES];
self.navigationController.navigationBar.userInteractionEnabled = NO;
。还有其他解决方案吗?
这与多线程有关吗?
答案 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;
}
}
。