我有一个UIBarButtonItem *按钮 . 想法是用户按下按钮然后弹出一个窗口 . 这是在按钮的目标/动作中声明的(即点击按钮调用
(void)showMyWindow:(id)sender
其中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;
...
}
关键是:当我使用target-action调用方法时,我可以以某种方式执行此转换访问框架,但是当我使用performSelector:withObject时,我不能这样做:
为什么会有区别?为什么这个演员阵容可以在一个案例中执行,而不是在另一个案
谢谢 .
1 回答
UIBarButtonItem来自NSObject,而不是UIView,并且没有frame属性 . 在这种情况下,发件人很可能不是您的栏按钮项,而是属于它的私人视图(如果您使用的是系统项)或其自定义视图属性 .
当你调用它"manually"时,你确实发送了没有框架的UIBarButtonItem实例,并且在将它转换为UIView时会崩溃并向它询问框架属性 .
您可以通过检查调试器中的
sender
对象来阐明实际发送的内容 . 它将是第一个实例中的视图子类,第二个实例中是UIBarButtonItem(或子类) .