UIBarButtonItem:对于目标操作调用与performSelect:withObject:,帧被区别对待



我有一个UIBarButtonItem*按钮。这个想法是用户按下按钮,然后弹出一个窗口。这是在按钮的目标/动作中声明的(即点击按钮调用

(void)showMyWindow:(id)sender

其中发送方是UIBarButtonItem。

在showMyWindow:方法中,弹出窗口的绘制需要发送者的框架。现在,UIBarButtonItem通常不允许您访问其框架。作为一个小黑客,我将发送者转换为一个UIView,然后访问这个UIView的框架。我不认为这会奏效,但令人惊讶的是,它确实奏效了。

但是,我也想在其他地方调用showMyWindow:方法。所以我有一行代码:

[self performSelector:@selector(showMyWindow:) withObject:self.button];

在这里,我的应用程序崩溃了。我已经准确地指出了这个问题:

(void)showMyWindow:(id)sender 
{
    //I should be checking before the cast here, but it helps illustrate the problem
    UIView *senderAsView = (UIView *)sender
    CGRect frame = senderAsView.frame;
    ...
}

重点是:当我调用带有目标操作的方法时,我可以以某种方式执行此强制转换+访问帧,但当我使用performSelect:withObject:时则不行

为什么会有区别?为什么这个演员可以在一种情况下表演,而不能在另一种情况中表演?

谢谢。

作为一个小黑客,我将发送者转换为一个UIView,然后访问这个UIView的框架。我不认为这会奏效,但令人惊讶的是,它确实奏效了。

UIBarButtonItem是NSObject的派生,而不是UIView,并且没有框架属性。在这种情况下,发送者很可能不是你的条形按钮项目,而是属于它的私人视图(如果你使用的是系统项目)或它的自定义视图属性。

当您称之为"手动"时,实际上正在发送UIBarButtonItem实例,该实例没有框架,当您将其强制转换为UIView并要求其提供框架属性时,该实例将崩溃。

您可以通过检查调试器中的sender对象来澄清实际发送的内容。在第一个实例中,它将是一个视图子类,在第二个实例中是一个UIBarButtonItem(或子类)。

相关内容

  • 没有找到相关文章

最新更新