单身人士不会立即更新变量

时间:2012-07-31 22:18:40

标签: objective-c ios nsstring singleton

这里有一个单例是头文件:

#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,所以当我单击一个按钮转到下一个视图时,它应该输出字符串的值,但它只能第二次工作。如果变量设置为dog,则首先它不输出任何内容,然后当我关闭视图并再次尝试时,它会输出dog。但是,如果我然后将变量更改为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没有显示正确,但是文本视图中的文本也没有显示,它与NSLog的功能相同。

1 个答案:

答案 0 :(得分:1)

这里有一个假设,关于事情发生的顺序是不正确的。假设有一个segue参与其中,didSelectRowAtIndexPath:在新视图控制器准备好之后但在显示之前被调用。将代码移至viewWillAppear:viewDidAppear:会延迟执行,直到调用控制器设置了新数据为止。

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