2012-07-31 63 views
1

我这里有一单是头文件:辛格尔顿没有更新变量立即

#import <Foundation/Foundation.h> 
@interface Shared : NSObject 
{ 
    NSString *messages; 
} 
@property (nonatomic, retain) NSString *messages; 

+ (Shared*)sharedInstance; 

@end 

下面是执行:

#import "Shared.h" 
static Shared* sharedInstance; 

@implementation Shared 

@synthesize messages; 


+ (Shared*)sharedInstance 
{ 
    if (!sharedInstance) 
    { 
     sharedInstance = [[Shared alloc] init]; 
    } 
    return sharedInstance; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     messages = [[NSString alloc] init]; 
    } 
    return self; 
} 
@end 

的问题是,当我使用

[Shared sharedInstance].messages = someVariable; 

我可以使用 NSLog([Shared sharedInstance] .messages); 它显示正确的输出,但是当我从另一个类检查时,NSLog不显示任何输出。我在另一个类的viewDidLoad方法中有NSLog,所以当我点击一个按钮进入下一个视图时,它应该输出字符串的值,但它只能第二次运行。如果变量设置为狗,首先它不输出,然后当我关闭视图并再次尝试时,它输出狗。但是,如果我然后将变量更改为cat,它将输出dog,并在下一次尝试时输出cat。我希望它立即更新,而不是始终保持一个。

编辑:下面是来自其它类 这种特定部分是从一个视图控制器类中的方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
//Omitted, just preparing the DB, and emptying the array. 
if ([db open]) 
    { 
     FMResultSet *s = [db executeQueryWithFormat:@"SELECT ShabadID FROM Shabad WHERE Gurmukhi LIKE %@", currentLine]; 
     while ([s next]) 
     { 
      lineID = [s intForColumn:@"ShabadID"]; 
     } 
     s = [db executeQueryWithFormat:@"SELECT Gurmukhi, ShabadID FROM Shabad WHERE ShabadID LIKE %i", lineID]; 
     while ([s next]) 
     { 

      //NSLog([s stringForColumn:@"Gurmukhi"]); 
      [paragraphArray addObject:[s stringForColumn:@"Gurmukhi"]]; 
     } 
     Text = @""; 
     for (int i = 0; i<[paragraphArray count]; i++) 
     { 
      Text = [Text stringByAppendingFormat:@"%@\n", [paragraphArray objectAtIndex:i]]; 
     } 
     [Shared sharedInstance].messages = Text; 
    } 

然后在另一个类中,其中,我想要的文本显示的代码,在viewDidLoad中方法,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog([Shared sharedInstance].messages); 
    UITextView *myUITextView = [[UITextView alloc] initWithFrame:CGRectMake(0,30,310,450)]; 
    myUITextView.text = [Shared sharedInstance].messages; 
    myUITextView.textAlignment = NSTextAlignmentCenter; 
    myUITextView.textColor = [UIColor blackColor]; 
    myUITextView.font = [UIFont fontWithName:@"GurbaniLipiLight" size:24]; 
    [myUITextView setBackgroundColor:[UIColor clearColor]]; 
    myUITextView.editable = NO; 
    myUITextView.scrollEnabled = YES; 
    [ScrollerView addSubview:myUITextView]; 
} 

确定的NSLog显示不出来的权利,但同样没有在TextView的文本,它做的NSLog做同样的事情。

+0

代码看起来像是在显示错误的东西?如果你将它移动到'viewDidAppear'而不是'viewDidLoad',它仍然是错误的吗? – 2012-07-31 22:22:34

+0

你可以包含更多的“消费”代码吗?特别是来自“其他类”的代码,但理想情况下是一个充分的用例,表明不良行为。 – 2012-07-31 22:22:46

+0

单例看起来不错,请您分享viewDidLoad和代码的第二部分,何时再调试打印值?另外,第二次在哪里?在按钮处理程序? – 2012-07-31 22:22:48

回答

1

这里有一个关于什么顺序的事情发生在这个不太正确的假设。假设有一个涉及这个的segue,didSelectRowAtIndexPath:在新视图控制器准备好之后但在它被显示之前被调用。将代码移动到viewWillAppear:viewDidAppear:将延迟执行,直到呼叫控制器设置新数据。

使用segue的控制器之间通信的另一种方法是在第一个控制器中使用prepareForSegue:来设置第二个控制器需要的数据。这种方式应该可以在视图加载时使用。