UIBarButtonItem 在显示两次后未触发选择器

Posted

技术标签:

【中文标题】UIBarButtonItem 在显示两次后未触发选择器【英文标题】:UIBarButtonItem not firing selector after it has been shown twice 【发布时间】:2013-05-30 00:17:38 【问题描述】:

我在 UIBarButtonItem 上使用这个分类方法来创建自定义按钮如下:

+ (UIBarButtonItem*)itemWithImage:(UIImage*)image forState:(UIControlState)controlState target:(id)target action:(SEL)action

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:image forState:controlState];

    button.frame= CGRectMake(0.0, 0.0, 44, 44);
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 44, 44) ];
    [v addSubview:button];

    return [[UIBarButtonItem alloc] initWithCustomView:button];

然后我创建按钮并将它们分配给我的视图控制器中的导航项,如下所示:

-(void)viewDidLoad
    [super viewDidLoad]; 
    UIBarButtonItem * cancelButtonItem = [UIBarButtonItem itemWithImage:[UIImage imageNamed:@"Cancel"] forState:UIControlStateNormal target:self action:@selector(cancel)];
    self.navigationItem.leftBarButtonItem = cancelButtonItem;

    UIBarButtonItem * checkmarkButtonItem = [UIBarButtonItem itemWithImage:[UIImage imageNamed:@"checkmark_active"] forState:UIControlStateNormal target:self action:@selector(done)];
    self.navigationItem.rightBarButtonItem = checkmarkButtonItem;

我第一次创建视图控制器并推送它时,按钮可以工作,但是当创建一个全新的视图控制器并将其推送到导航堆栈时,它会中断。有任何想法吗?我已经彻底调试了这个并且没有想法。

【问题讨论】:

我注意到你创建了UIView* v 然后从不使用它。这不是问题,但您可以删除这些行,它们不是必需的。 我不明白你什么时候有问题。您的标题在显示两次后显示。你的最后一段说它在“我创建一个视图控制器并推送它”时有效,但在“创建一个全新的视图控制器并将其推送到导航堆栈”时不起作用——这两个听起来是一回事。 @progrmr 好点,错过了谢谢。 @rdelmar 我很抱歉不清楚。我想包含一个视频,但我正在尝试获得一个好的截屏应用程序。他们是一样的东西。我创建一个并按下它,按钮就会起作用,创建另一个并按下它,触摸时没有任何反应。 【参考方案1】:

您的代码的类别部分似乎没有任何问题。我怀疑该错误可能源于其他原因。更多信息或代码可能会有所帮助......你所说的break等是什么意思? 在将 ViewController 压入堆栈之前检查初始化 ViewController 的方式,如果使用 outlet,可能是简单的语法错误或错误的 nib 名称。

【讨论】:

感谢您的回复和优点。这里没有使用界面构建器。它以非常标准的方式初始化。似乎按钮以某种方式被禁用,或者动作和目标被取消了。

以上是关于UIBarButtonItem 在显示两次后未触发选择器的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 表单 10g 中的 LOV 填充后未触发后查询触发器

为啥 RecyclerView 项目在点击两次后才改变背景颜色?

为啥在并行子进程之间分叉两次后 pipe() 不工作?

jQuery 在第一次切换后仅在 Safari iOS5 中单击 3 次后触发

显示 iOS 共享表后未调用 viewWillDisappear

为啥 QtSerialPort 在运行超过一次或两次后不会读取?