我是iOS开发的新手,我正在努力制作一个连接到BLE设备的应用程序。由于我有许多视图控制器,我需要保持外围设备始终连接在一起。
为实现这一目标,我在Singleton
中实现了所有BLE连接方法。这很有效,我从View Controller
调用connect方法,Singleton
连接到外设。
现在,问题是我的视图控制器中有一个UILabel
我希望通过Singleton
的连接状态(扫描,连接,连接,断开连接)进行更新。
所以我尝试从View Controller
获取实例并直接更改标签,如:
MainViewController *controller = [[MainViewController alloc] init];
controller.myLabel.text = @"TEST";
我还实例化了视图控制器类,如:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle: nil];
MainViewController *controller = (MainViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"MainVC"];
然后我尝试在主View Controller
中创建一个方法:
- (void) updateLabel:(NSString *) labelText{
NSLog(@"CALLED IN MAIN");
self.myLabel.text = labelText;
}
从Singleton
调用它,如:
MainViewController *controller = [[MainViewController alloc] init];
[controller updateLabel:@"TEST"]
正确调用(NSLog
已显示),但标签未更新。
我真的不知道如何从View Controller
更新我的Singleton
标签。不知道我试图做的方式是否正确。
非常感谢任何建议或帮助。谢谢。
----- 更新: -----
感谢Mundi和Nikita,我有更好的方法通过NSNotification实现我需要的东西。对于所有需要它的人来说,我就是这样做的:
在View Controller
viewDidLoad
中,我致电:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionLabel:) name:@"connectionLabelNotification" object:nil];
然后在同一个类中,我实现了通知观察者方法,如:
- (void)updateConnectionLabel:(NSNotification *) notification {
if ([[notification name] isEqualToString:@"connectionLabelNotification"]) {
self.connectionLabel.text = notification.object; //The object is a NSString
}
}
然后在我的Singleton
,当我需要时,我打电话:
[[NSNotificationCenter defaultCenter] postNotificationName:@"connectionLabelNotification" object:[NSString stringWithFormat:@"CONNECTED"]];
当View Controller
收到来自Singleton
的通知时,它会使用我在通知对象上添加的文本更新标签(在本例中为@“CONNECTED”)。
答案 0 :(得分:3)
您需要使用NSNotification
。
以下是示例代码:
viewDidLoad :中的
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mySelector:)
name:DeviceStateChanged
object:nil];
dealloc :
[[NSNotificationCenter defaultCenter] removeObserver:self
name:DeviceStateChanged
object:nil];
还在 ViewController :
中添加方法- (void) mySelector:(NSNotification *) notification {
// action performed
}
Sigleton 中的
- (void) foo {
/// some actions
// device connected
[[NSNotificationCenter defaultCenter] postNotificationName:DeviceStateChanged object:self];
///
}
建议:将通知名称移动到常量并使用常量名称。有关命名约定,请参阅Apple指南
答案 1 :(得分:1)
执行此操作的正确方法是NSNotification
。该通信设备正是针对这种情况。它在不关心潜在接收器是否可用的情况下广播消息。
在视图控制器中,当NSNotificationCenter
addObserver
/ removeObserver
出现/消失时,请致电postNotification:
/ {{1}}。您通过{{1}}发布了通知。