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があるので、ボタンをクリックして次のビューに移動すると、文字列の値が出力されますが、2回目しか機能しません。変数がdogに設定されている場合、最初は何も出力しません。次に、ビューを閉じて再試行すると、dogが出力されます。ただし、変数をcatに変更すると、dogが出力され、次の試行でcatが出力されます。常に遅れをとるのではなく、すぐに更新してほしい。

編集:他のクラスのコードは次のとおりですこの特定のセクションは、メソッドのViewControllerクラスからのものです

- (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と同じことを行います。

4

1 に答える 1

1

ここでは、物事がどのような順序で発生するかについての仮定がありますが、それは正しくありません。これに関係するセグエがあると仮定するとdidSelectRowAtIndexPath:、新しいView Controllerが準備された後、表示される前に呼び出されます。コードを移動するviewWillAppear:viewDidAppear:、呼び出し元のコントローラーが新しいデータを設定するまで実行を遅らせます。

セグエを使用するコントローラー間の通信のもう1つのアプローチはprepareForSegue:、最初のコントローラーで使用して、2番目のコントローラーが必要とするデータを設定することです。そうすれば、ビューがロードされたときに使用可能になります。

于 2012-08-01T01:14:02.340 に答える