使用NSSet / allTargets获取xib所谓的“文件所有者”?

时间:2013-12-05 08:42:55

标签: ios objective-c uiview uicontrol

查看此图像,您可以看到从笔尖加载的UIView具有“文件所有者”

enter image description here

请注意,在xib中,Apple标记了“文件所有者”。

所以,打开Xcode,打开任何xib,查看占位符,直接看下面,看看:

“文件所有者”。

在此特定示例中,“xib-file-owner”恰好是类LoginScreen。

因此,在运行时,对于由此xib创建的特定事物,“was-xib-file-owner”(用于拼写短语)实际上将是:

它将是:LoginScreen类的一些特定实例。

现在在运行时。显然,在UIView中,对于每个UIButton,您只需调用

即可
[self.someButton sendActionsForControlEvents:UIControlEventTouchUpInside ];

然后你确实“去了”,确切地说:

您转到:类LoginScreen的实例

{注意 - 当然,UIButton可以指向任何地方。我问的是我们知道UIButton确实指向UIButton的“was-xib-file-owner”的情况。}

实际上,方法allTargets确实会返回该目标(在本例中是一些类LoginScreen 的实例)作为它返回的N个目标的一部分,实际上选择器等等。

我不能为allTargets,NSSet等编写代码。

有人可以告诉我如何使用allTargets和一些计算机代码提取类LoginScreen的实例吗?即在xib中看到的“was-xib-file-owner”的运行实例?欢呼声。


随后:

奇怪的是,这个问题的答案主要是:

[self.allTargets anyObject]

因为,如果从xib创建,那么只有一个,并且,正是上面粗体描述的。重复: OF COURSE,UIButton可以在任何地方指向。我问的是我们知道UIButton确实指向UIButton的“was-xib-file-owner”的情况。

在那个(“正常”)的情况下,答案的确非常简单 - [self.allTargets anyObject]。

3 个答案:

答案 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

Interface Builder中的“文件所有者”只是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
}
但是,我不知道为什么你需要这样做。也许你的问题有一个更简单的解决方案?