【问题标题】:iPhone SDK: Accessing methods in other classesiPhone SDK:访问其他类中的方法
【发布时间】:2009-10-24 15:38:44
【问题描述】:

在我的 iPhone 应用程序中,我有多个类文件,我有我的主应用程序的类文件,然后我有我的 UIView 类文件。我在 UIView 类文件中声明了一个简单的 -(void) 方法,如何从我的主应用程序类文件中访问它?

更多细节:在我的应用程序中播放了一个视频,当这个视频播放完毕时,发送一个通知并执行操作,我已经成功设置了,但是当电影完成时,我想要一个在另一个要执行的类文件。如果该方法是在同一个类文件中声明的,我只需使用以下代码:[self mySimpleVoidMethod];但显然,如果方法是在不同的类文件中声明的,这不起作用。我相信可以访问在不同的类文件中声明的方法,但我只是不知道如何去做。抱歉,如果我使用完全不正确的术语来命名事物。但我对一起编程比较陌生。

【问题讨论】:

    标签: objective-c iphone


    【解决方案1】:

    您有几个选项,具体取决于您的设置。以下是一些:

    1) 在调用者的类中添加对具有函数(被调用者)的类的引用作为属性:

    来电者.h

    @interface Caller : SomeObject {
        Callee *myCallee;
        ...
    }
    @property(nonatomic, retain) Callee *myCallee;
    

    来电者.m

    @synthesize myCallee;
    -(void)someAction {
        [myCallee doSomething];
    }
    

    在初始化两个类后设置 Caller 的东西:

    caller.myCallee = callee;
    

    2) 使用另一个通知事件,就像您已经知道该怎么做一样。

    3) 如果您有一堆不同的类,调用者可能需要调用它们都支持相同的方法,请使用协议:

    DoesSomething.h

    @protocol DoesSomething
        -(void)doSomething;
    @end
    

    被调用者.h

    @interface Callee : NSObject<DoesSomething> {  // NSObject or whatever you're using...
        ...
    }
    -(void)doSomething;
    

    来电者.h

    @interface Caller : SomeObject {
        id<DoesSomething> *myCallee;
        ...
    }
    @property(nonatomic, retain) id<DoesSomething> *myCallee;
    

    ...然后按照示例 1.

    4) 使用 performSelector 向类发送消息。

    来电者.h

    @interface Caller : NSObject {
        SEL action;
        id callee;
    }
    -(void)setupCallbackFor:(id)target action:(SEL)callback;
    

    来电者.m

    -(void)setupCallbackFor:(id)target action:(SEL)callback {
        callee = target;
        action = callback;
    }
    
    -(void)someAction {
        if([callee respondsToSelector:action]) {
            [callee performSelector:action];
    }
    

    我确信还有其他方法,并且每种方法各有利弊,但其中的某些内容应该满足您的需求和/或给您足够的扫描文档以填补任何空白...

    【讨论】:

    • 嗯,我还是有点困惑,假设我有一对类,second.h 和 second.m,并且在其中声明的是一个方法,可以说将图像视图的 alpha 设置为零,您能否在其他类文件中使用该方法显示第一组类文件(first.h + first.m)的具体示例。这将有助于让我更清楚。无论如何,谢谢。
    • 这取决于您的场景,但是正如您所描述的类,那么对于上面的每个场景,首先是 Caller,其次是 Callee(抱歉,类名选择不当 - 我的意思是,被调用者?真的吗?是的...)有时它可以帮助我复制并粘贴到编辑器中,然后搜索/替换直到有意义。
    • 好的,我现在可以更了解您的示例了。我尝试了您的第一个建议,通过在调用者的类中添加对具有函数作为属性的类的引用,但它引用了对我不起作用的类,使用您的代码,(但将“SomeObject”更改为“ UIView") 我收到一个错误 x2 "expected specifier-qualifier-list before 'Callee'" 这让我想知道 Callee *myCallee;是引用类的正确方法。
    • 哦,等等,我知道我做错了什么,但无论如何它仍然不起作用,我收到错误,无法识别的选择器发送到实例......当尝试使用方法通过引用它的类。
    【解决方案2】:

    几周前我写了一篇博文,概述了一种方法。它与之前的答案类似,并包含一些您可以下载和查看的示例代码。它基于使用表视图控制器,但您应该能够轻松地将这些想法适应您的应用程序。

    Passing values and messages between views on iPhone

    【讨论】:

      【解决方案3】:

      您需要另一个类的实例,可从影片结束时运行的代码访问。通常,这是通过将另一个类的实例存储为类中的字段来实现的,通过“setter”或在构造过程中设置。也可以使用key-value observing,看代表电影播放状态的按键;另一个类的实例可以注册来观察这个键的变化。

      特别是对于使用 UIView 的模式,视图的 UIViewController 将可以访问它(通过view 方法)。如果您的“主应用程序的类文件”有一个指向控制器的指针——它们可能会通过 Interface Builder 设置——那么这是访问 UIView 实例的一种简单方法。

      【讨论】:

        猜你喜欢
        • 2019-03-18
        • 2014-09-05
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2021-10-01
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多