我在看起来很简单的事情上遇到了很多麻烦。我无法从基于导航的iOS应用中以编程方式更新UILabel。我不想使用按钮,因为此标签旨在报告外部系统的状态,并且应在启动时进行更新。如果不需要的话,无需让用户费劲去触摸按钮。

以下是我已采取的步骤的详尽列表。很抱歉,其中某些步骤似乎不必要,但以我的经验,即使是最小的被遗忘的步骤也可能是造成此问题的原因。

在Xcode中基于导航的全新App中,我正在执行以下步骤:


用通用的UIView类替换UITableView
将文件所有者的视图出口重新连接到新的UIView
将UILabel添加到UIView的中心,使文本居中,并保留默认文本。
保存并退出界面生成器
RootViewController.h

#import <UIKit>
@interface RootViewController:UIViewController {
    UILabel * myLabel;
}
@属性(非原子的,保留)IBOutlet UILabel * myLabel;
@结束
RootViewController.m
#import "RootViewController.h"
@implementation RootViewController
@synthesize myLabel;
...

从RootViewController.m中删除了TableView内容
将IBOutlet myLabel连接到RootViewController.xib中的标签
保存并退出界面生成器
tempNavAppAppDelegate.m
...
-(BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //应用程序启动后进行自定义的替代点。
    //将导航控制器的视图添加到窗口并显示。
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];
    RootViewController * rootViewCont = navigationController.visibleViewController;
    rootViewCont.myLabel.text = @“测试”;
    NSLog(@“ Label Text:%@”,rootViewCont.myLabel.text);
    返回是;
}
...
构建/运行


标签显示为“标签”而非“测试”。日志报告:tempNavApp[94186:207] Label Text: (null)

我尝试了许多不同的方法来完成此操作,但是任何帮助将不胜感激。

最佳答案

旅程

在发现我的rootViewCont.myLabel也为零之后,感谢mprudhom的帮助,我决定进行测试,看看是否可以在RootViewController.m的myLabel.text方法中为- (void)viewDidLoad分配一个值。
它起作用了,我能够直接从RootViewController更改文本。但是,尽管这证明我的View Controller并未损坏,但并不能解决我最初从tempNavAppAppDelegate.m更改UILabel的愿望。

Elliot H.然后建议navigationController.visibleViewController实际上没有返回视图控制器。我已经测试了rootViewCont的值,并以RootViewController的形式返回,但是Elliot的建议使我思考了应用程序的生命周期以及代码的不同部分实际加载的时间。

所以我开始在启动过程的每个步骤中打印NSLog(application:didFinishLaunchingWithOptions :, applicationDidBecomeActive :, viewDidLoad,viewDidAppear :),并且令我惊讶的是,[self.window makeKeyAndVisible];并不意味着视图将在application:didFinishLaunchingWithOptions之前加载:做完了。

掌握了这些知识后,我知道了问题出在哪里。解决方案(或者至少是我的解决方案)似乎是NSNotificationCenter。我现在已经在tempNavAppAppDelegate中注册了通知,并且正在RootViewController的viewDidAppear:方法中广播通知。



有关守则

RootViewController.h:

@interface RootViewController : UIViewController {
    IBOutlet UILabel *myLabel;
}
@property (nonatomic, retain) UILabel *myLabel;
@end


RootViewController.m:
@implementation RootViewController
@synthesize myLabel;
- (void)viewDidLoad {
    [super viewDidLoad];
    NSParameterAssert(self.myLabel);
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"viewDidAppear" object:self];
}


tempNavAppAppDelegate.h:
@interface tempNavAppAppDelegate : NSObject  {
    UIWindow *window;
    UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
- (void)viewDidAppearNotification:(id)notification;
@end


tempNavAppAppDelegate.m:
@implementation tempNavAppAppDelegate
@synthesize window;
@synthesize navigationController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidAppearNotification:) name:@"viewDidAppear" object:nil];
    return YES;
}
- (void)viewDidAppearNotification:(id)notification
{
    NSString *noteClass = [NSString stringWithFormat:@"%@", [[notification object] class]];
    if ([noteClass isEqualToString:@"RootViewController"]) {
        RootViewController *noteObject = [notification object];
        noteObject.myLabel.text = @"Success!";
    }
}

关于objective-c - 在基于导航的iOS应用中从App Controller以编程方式更改UILabel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4116010/

10-10 20:49