Вызов метода из принадлежащего объекта на владельца - PullRequest
0 голосов
/ 21 мая 2011

У меня есть класс табличного представления с именем RootViewController и класс, обеспечивающий функциональность WiFi, с именем WifiClass.Когда я загружаю класс RootViewController, я вызываю метод с именем setup на WifiClass, который выполнит инициализацию подключения Wi-Fi.

Во время работы приложения, если какое-либо подключенное устройство отправляет некоторые данныена моем устройстве есть делегат обработчика потока в классе Wifi, который сработает.В то время мне нужно вызвать метод с именем myMethod из моего RootViewController.Может кто-нибудь сказать мне хороший способ сделать это правильно?

Ответы [ 6 ]

2 голосов
/ 21 мая 2011

В Objective-C существуют различные концепции, такие как

1 голос
/ 21 мая 2011

Я предполагаю, что вы имеете в виду, что обработчик потока является делегатом из класса WifiClass? В этом случае установите свой RootViewController в качестве делегата WifiClass. В обратном вызове делегата, реализованном в RootViewController, вызовите myMethod в RVC:

// 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

Надеюсь, это поможет!

0 голосов
/ 21 мая 2011

просто отправьте уведомление ......

опубликуйте его так ...

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

получите его вот так ...

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

ваш метод ....

  • (void) MyMethod: (NSNotification *) уведомление {.... .... .... ur code}

удали его

[[NSNotificationCenter defaultCenter] removeObserver:self];
0 голосов
/ 21 мая 2011

Есть несколько вещей, которые вы можете сделать. Один из них - иметь слабую ссылку на объект, метод которого вы хотите вызвать. В этом случае контроллер представления является объектом. Объявите assign -able свойство MainViewController (при условии, что это класс) в классе wifi и установите его в качестве контроллера представления во время инициализации. Поскольку у вас есть ссылка на контроллер представления, вы можете вызвать нужный метод в методе делегата.

Другой подход заключается в использовании 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. Это очень мощный инструмент на мой взгляд.

0 голосов
/ 21 мая 2011

Попробуйте это

[[UIApplication sharedApplication] sendAction:@selector(yourMethod) to:nil from:self forEvent:someEvent];
0 голосов
/ 21 мая 2011

Почему бы не переместить метод welcomemessage в appDelegate.Это будет иметь больше смысла, так как я предполагаю, что «сообщение» не нужно связывать с каким-либо конкретным контроллером представления.

Поэтому, когда ваш wifi delegate запускается, просто ссылайтесь на appDelegate и вызывайте метод:

[[[UIApplication sharedApplication] delegate] welcomeMessage];
...