我有一个名为RootViewController
的表视图类和一个提供名为WifiClass
的WiFi功能的类。当我加载RootViewController
类时,我在setup
上调用一个名为WifiClass
的方法,它将执行Wifi连接初始化。
当应用程序正在运行时,如果任何连接的设备向我的设备发送了一些数据,则会在Wifi类中触发一个流处理程序委托。那时,我需要从myMethod
调用一个名为RootViewController
的方法。请有人能告诉我一个好的方法吗?
答案 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];
你的方法......
将其删除
[[NSNotificationCenter defaultCenter] removeObserver:self];