【问题标题】:Objective C: Why can't I update a label from another class (AppDelegate > MainViewController)?目标 C:为什么我不能从另一个类(AppDelegate > MainViewController)更新标签?
【发布时间】:2013-01-18 20:21:16
【问题描述】:

一段时间以来,我一直在尝试通过从 AppDelegate.mMainViewController.m 的方法调用来更新 UILabel。我真的不明白为什么这不起作用。 方法被调用了并且一切正常除了最后一点更改/更新标签文本

工作流程

AppDelegate 中的 applicationDidBecomeActive 中调用 MainViewController 中的方法 updateLabelMethod 处理数据并更新标签。

代码

MainViewController.h

UILabel *daysResultOutlet;
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>
     @property (strong, nonatomic) IBOutlet UILabel *daysResultOutlet;
@end

@interface MainViewController ()
    - (void) updateLabelMethod;
@end 

MainViewController.m

@synthesize daysResultOutlet;
- (void) updateLabelMethod {
    NSString *value = @"test";
    NSLog(@"Testing to print value: %@",value);
    [daysResultOutlet setText:value]; //insert in label
}

AppDelegate.m

#import "AppDelegate.h"
#import "MainViewController.h"

@interface MainViewController ()
@end

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    MainViewController *mvsAsObj = [[MainViewController alloc] init];
    [mvsAsObj updateLabelMethod]; //running function, value correctly logged but lbl not updated
    mvsAsObj.daysResultOutlet.text = @"update!!"; // not working!

}

结果与尝试

标签不会通过跨类方法调用 updateLabelMethod 或通过 mvsAsObj.daysResultOutlet.text = @"update!!"; 更新,但是,该方法被调用并且它的值是:LOG: Testing to print value: test。此外,如果我从 MainViewController 中调用此方法:[self updateLabelMethod] 一切正常。

我已经尝试了基本上所有的解决方案,但问题是,我在这里做的是直接解决几个 Stackoverflow 问题,所以我不知道如何继续。我正在使用故事板。

还有什么想法

【问题讨论】:

  • 这与 Xcode 没有任何关系。

标签: ios objective-c class uilabel


【解决方案1】:

感谢 Ryan Poolos 指出让我的控制器监听 UIApplicationDidBecomeActiveNotification 而不是从 AppDelegate 调用方法的可能性。这就是我最终这样做的方式:

在 MainViewControll 中,ViewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(becomeActive:)
    name:UIApplicationDidBecomeActiveNotification
    object:nil];

- (void)becomeActive:(NSNotification *)notification {
    NSLog(@"active");
}

清理通知

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

【讨论】:

    【解决方案2】:

    你为什么期待

    MainViewController *mvsAsObj = [[MainViewController alloc] init];
    

    返回已经存在的视图控制器的同一个实例? alloc 创建一个新实例。修改它显然不会对其他实例产生任何影响。

    【讨论】:

    • @H2CO3 的意思是因为您使用的是 IBOutlet,我们假设您使用的是故事板或界面构建器来创建标签。所以你需要获取那个 viewController 实例并调整它的标签。
    • @RyanPoolos 我该怎么做,你能给我举个例子吗?在这里和我在一起,我是 obj C 和 iOS 开发的新手:/
    • @H2CO3 你必须在这里更清楚,而不是告诉我什么不该做,而是告诉我我应该实际改变什么以使其一切正常......就像改变那条线到MainViewController *mvsAsObj; Constructivism,你知道..
    • 首先,您为什么要尝试更改 App Delegate 中的文本?这些类型的事情通常应该在其他地方完成。
    • 好吧,当使用 Storyboards 时,AppDelegate 不是进行此类调用的安全场所。如果您使用 NSNotificationCenter 并在您的 MainViewController 中订阅 UIApplicationDidBecomeActiveNotification 通知会更好。
    【解决方案3】:

    您是否将代码中的 UILabel 连接到 Storyboard/Nib 文件中的实际标签?

    只是问,因为我有时也会忘记这一点......

    【讨论】:

    • 是的,我有,这是别的东西
    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多