查看此图像,您可以看到从笔尖加载的UIView具有“文件所有者”
所以,打开Xcode,打开任何xib,查看占位符,直接看下面,看看:
在此特定示例中,“xib-file-owner”恰好是类LoginScreen。
因此,在运行时,对于由此xib创建的特定事物,“was-xib-file-owner”(用于拼写短语)实际上将是:
现在在运行时。显然,在UIView中,对于每个UIButton,您只需调用
即可[self.someButton sendActionsForControlEvents:UIControlEventTouchUpInside ];
然后你确实“去了”,确切地说:
{注意 - 当然,UIButton可以指向任何地方。我问的是我们知道UIButton确实指向UIButton的“was-xib-file-owner”的情况。}
实际上,方法allTargets
确实会返回该目标(在本例中是一些类LoginScreen 的实例)作为它返回的N个目标的一部分,实际上选择器等等。
我不能为allTargets,NSSet等编写代码。
有人可以告诉我如何使用allTargets和一些计算机代码提取类LoginScreen的实例吗?即在xib中看到的“was-xib-file-owner”的运行实例?欢呼声。
随后:
奇怪的是,这个问题的答案主要是:因为,如果从xib创建,那么只有一个,并且,正是上面粗体描述的。重复: OF COURSE,UIButton可以在任何地方指向。我问的是我们知道UIButton确实指向UIButton的“was-xib-file-owner”的情况。
在那个(“正常”)的情况下,答案的确非常简单 - [self.allTargets anyObject]。
答案 0 :(得分:1)
实际上按钮没有“所有者”。
UIButton是特定视图的子视图,在IB中,您在某个视图中拖动按钮,然后该按钮将成为该视图的子视图。要检索按钮的超级视图,请致电[myButton superview];
然后一个Button可以被引用为某个类的属性或iVar,但它是其他的。
答案 1 :(得分:1)
运行时视图中没有文件所有者(如IB所示)。有关文件所有者的信息不存在。你能做的最近的就是检查目标班级:
if([self respondsToSelector:@selector(allTargets)]) {
NSSet *owners = self.allTargets;
for(id owner in owners) {
if([owner isKindOfClass:[UIViewController class]])
NSLog(@"owner: %@", owner);
}
}
或只是假设目标是所有者
if([self respondsToSelector:@selector(allTargets)]) {
id owner = [self.allTargets anyObject];
NSLog(@"owner: %@", owner);
}
答案 2 :(得分:1)
您有一个UIButton
,并为某些控制事件附加了目标(通常是UIControlEventTouchUpInside
)。
您可以按如下方式获取UIButton
的目标
NSSet *targets = [myButton allTargets];
for( NSObject *target in targets )
{
//Do something with target
//Maybe it's a view:
if( [target isKindOfClass:[UIView class]] )
{
//Do something to view specific target
}
}
重要的是要注意两件事:
目标不是 UIButton
的“所有者”,也不需要是UIViews(如果我理解你的问题)。目标可以是任何对象,通常它们将来自NSObject
。
UIViewController
(通常)“拥有”笔尖的术语 - 它可能是也可能不是按钮的目标!
如果您确定您的按钮将文件所有者作为目标,那么您可以通过以下方式检查它(虽然我不建议这样编码):
//Assuming your File Owner is "LoginScreen" as in your picture
NSSet *targets = [myButton allTargets];
for( NSObject *target in targets )
{
//Is the target our File Owner class type?
if( [target isKindOfClass:[LoginScreen class]] )
{
LoginScreen *login = (LoginScreen *)target
//Do something with `login`
}
}
更好的方法是递归检查UIButton的nextResponder,直到您点击管理视图控制器。我没有测试过以下代码,但它遵循文档:
UIResponder *responder = [myButton nextResponder];
while( [responder isKindOfClass:[UIViewController class]] == NO &&
responder != nil )
{
responder = [responder nextResponder];
}
//If your button is "owned" in the responder chain
// by a UIViewController, then `responder` will be it
// otherwise `responder` will be nil
if( responder )
{
//Do something
}
但是,我不知道为什么你需要这样做。也许你的问题有一个更简单的解决方案?