2014-08-30 40 views
0

我遇到了标签问题,未在我的用户界面中正确更新。我有一个使用大纲视图切换视图的Mac OS X应用程序。我只想在切换到(FirstViewController)的视图上的标签上显示给用户的日期。当在一个新项目中单独实施时,我没有问题。但是,如果在视图更改的地方实现,标签的值不会更新,事实上,即使先前设置了控制台输出,也表明_dateLabel为(null)。有什么建议么?我必须错过一些非常基础的东西!标签更新为空

控制台输出:

2014年8月30日19:54:22.719 OutlineView [10420:1613022] StringedText是2014年8月30

2014年8月30日19:54:22.720 OutlineView [10420: 1613022]标签值(NULL)

我包括下面的代码:

// 
// FirstViewContorller.h 
// OutlineView 


#import <Cocoa/Cocoa.h> 

@interface FirstViewContorller : NSViewController 

@property (weak) IBOutlet NSTextField *dateLabel; 

-(void)updateDateScreen; 

@end 


// 
// FirstViewContorller.m 
// OutlineView 


#import "FirstViewContorller.h" 

@implementation FirstViewContorller 
@synthesize dateLabel = _dateLabel; 

-(void)updateDateScreen{ 
    //date calculation for main window 
    NSDate *now = [NSDate date]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateStyle:NSDateFormatterLongStyle]; 
    NSString *stringedText = [formatter stringFromDate:now]; 
    _dateLabel.stringValue = stringedText; 
    NSLog(@"StringedText is %@", stringedText); 
    NSLog(@"label value is %@", _dateLabel.value); 
} 

@end 




// 
// AppDelegate.m 
// OutlineView 


#import "AppDelegate.h" 
#import "Book.h" 
#import "FirstViewContorller.h" 

@interface AppDelegate() 

@property (weak) IBOutlet NSOutlineView *outlineView; 
@property (weak) IBOutlet NSTreeController *booksController; 

@end 


@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    //other code here 

    //Call the update method in FirstViewController to load date label 
    FirstViewContorller *instance = [[FirstViewContorller alloc]init]; 
    [instance updateDateScreen]; 

} 

//further unrelated code 

@end 
+0

您必须等到viewDidLoad或viewWillAppear才能更新UI对象,因为它们在视图加载之前不存在。而且您还需要确保UI对象正确链接到XIB中的类。 – 2014-08-30 13:25:43

回答

1

您有:

NSLog(@"label value is %@", _dateLabel.value); 

因为它是输出“空”你认为你的value为“null”时,十有八九是_dateLabel是空。

您正在创建instance对象,但随后调用更新UI对象的方法,该对象在您调用它时可能尚未从xib文件中取消存档。因此,虽然日期格式化程序正确地创建了一个字符串,但它试图将它设置为一个零对象。

可以通过检查的输出看到自己这一点:

NSLog(@"label is %@", _dateLabel); 

这可能会返回一个“空”的可能。

+0

谢谢Abizern--这让你很有意义。那么我该如何去更新方法中的标签呢?我不能直接从appDelegate调用它,所以我认为我只能从与XIB相关的类中调用它。 – user3932488 2014-08-30 11:20:48

+0

该单元格仅在视图加载后出现。所以在视图加载时或在'awakeFromNib'时调用它。 – Abizern 2014-08-30 13:48:16

+0

谢谢,解决了这个问题。我只是将我的代码移到了awakeFromNib方法中,现在它工作正常。我以为我最初在那里有代码,但没有被调用 - 为什么我创建了新的方法,但它现在正在工作。非常感谢你的帮助。 – user3932488 2014-08-30 21:04:09