从Singleton更改View Controller中的UILabel

时间:2014-07-21 09:05:11

标签: ios objective-c singleton bluetooth-lowenergy cbcentralmanager

我是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”)。

2 个答案:

答案 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}}发布了通知。