从所有者的拥有对象调用方法

时间:2011-05-21 14:11:54

标签: objective-c cocoa-touch ios composition

我有一个名为RootViewController的表视图类和一个提供名为WifiClass的WiFi功能的类。当我加载RootViewController类时,我在setup上调用一个名为WifiClass的方法,它将执行Wifi连接初始化。

当应用程序正在运行时,如果任何连接的设备向我的设备发送了一些数据,则会在Wifi类中触发一个流处理程序委托。那时,我需要从myMethod调用一个名为RootViewController的方法。请有人能告诉我一个好的方法吗?

6 个答案:

答案 0 :(得分:2)

Objective-C中有不同的概念,如

答案 1 :(得分:1)

我假设您的意思是流处理程序是WifiClass的委托 ?在这种情况下,将RootViewController设置为WifiClass的委托。在委托回调中,在RootViewController中实现,在RVC中调用myMethod:

// RootViewController.m
- (void)delegateCallback {
    [self myMethod];
}

对评论的回复: 在您的WifiClass中,您必须为委托创建一个实例变量。

@protocol WifiStreamDelegate
- (void)handleNewStream:(id)someStreamObject;
@end

@interface WifiClass : NSObject {
    // *delegate* is an object that conforms to the WifiStreamDelegate protocol
    id<WifiStreamDelegate> delegate;
    // …Other instance variables    
}
// You don't want to own your delegate
// Use the *assign* flag
@property (nonatomic, assign) id<WifiStreamDelegate> delegate;
// …Other properties

@end

@implementation WifiClass
@synthesize delegate;
// …Other methods
@end

然后在你的RootViewController中,你必须实现委托并挂钩:

#import "WifiClass.h"
@interface RootViewController : UITableViewController<WifiStreamDelegate>
{
    WifiClass *wifi;
    // …Other instance variables
}
// *wifi* is now an object you own—retain it
@property (nonatomic, retain) WifiClass *wifi
// …Other properties
@end

@implementation RootViewController
@synthesize wifi;

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (!(self = [super initWithCoder:aDecoder]))
        return nil;
    if (!self.wifi)
        wifi = [[WifiClass alloc] init];
    // Set delegate
    wifi.delegate = self;
}

- (void)myMethod {
    // Do something
}

// Delegate method
- (void)handleNewStream:(id)someStreamObject {
    // Handle stream
    [self myMethod];
}
@end

希望这有帮助!

答案 2 :(得分:0)

为什么不将welcomemessage方法移至appDelegate。这会更有意义,因为我认为“消息”不需要与任何特定的视图控制器相关联。

因此,当您的wifi delegate被触发时,只需引用appDelegate并调用方法:

[[[UIApplication sharedApplication] delegate] welcomeMessage];

答案 3 :(得分:0)

试试这个

[[UIApplication sharedApplication] sendAction:@selector(yourMethod) to:nil from:self forEvent:someEvent];

答案 4 :(得分:0)

你可以做的事情很少。一种是对要调用其方法的对象具有弱引用。在这种情况下,视图控制器是对象。在wifi类中声明assign(假设这是类)的MainViewController - 属性,并在初始化期间将其设置为视图控制器。由于您具有对视图控制器的引用,因此可以在委托方法中调用所需的方法。

另一种方法是使用Blocks。块的定义可以是 -

typedef void (^UpdateHandler)(void);

...

@interface WiFiConnection:NSObject <...> {
    ...
    UpdateHandler updateHandler;
}
...
- (void)setUpdateHandler:(UpdateHandler)handler;
@end

@implemention WiFiConnection
...
- (void)setUpdateHandler:(UpdateHandler)handler {
    updateHandler = handler;
}
...
- (void)delegateMethodFromWhichYouWantToInvoke {
    ...
    if ( updateHandler != NULL ) {
        dispatch_async(dispatch_get_main_queue(), updateHandler);
    }
}
...
@end

您现在可以在初始化期间传递更新块,

WiFiConnection *connection = [[WiFiConnection alloc] init];
...
__block MainViewController *controller = self;
[connection setUpdateHandler:^{
    [controller welcomeMessage];
}];

那里可能有很多。如果还不清楚,请告诉我。阅读GCD。在我看来,这是一个非常强大的工具。

答案 5 :(得分:0)

只是发送通知......

像这样张贴......

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyMethodNotification" object:self];

像这样收到......

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MyMethod:) name:@"MyMethodNotification" object:nil];

你的方法......

  • (void)MyMethod:(NSNotification *)通知{ .... .... .... 你的代码 }

将其删除

[[NSNotificationCenter defaultCenter] removeObserver:self];