0

HomeViewController.h

#import "DataParser.h"
@interface HomeViewController : UIViewController <DataParserDelegate>
{
    UILabel *theLabel;
}

HomeViewController.m

#import "HomeViewController.h"
@implementation HomeViewController
-(void)viewDidLoad
{
    theLabel = [[UILabel alloc] initWithFrame:CGRectMake(200, 200, 100, 30)];
    theLabel.text = @"Bob";
    theLabel.font = [UIFont italicSystemFontOfSize:20.0];
    theLabel.textColor = [UIColor whiteColor];
    theLabel.backgroundColor = [UIColor blueColor];
    [self.view addSubview:theLabel];

    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [theButton addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];
    [theButton setTitle:@"Big Button" forState:UIControlStateNormal];
    theButton.frame = CGRectMake(100,100,200,50);
    [self.view addSubview:theButton];
}
-(void)clicked:(id)sender
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),
    ^{
        DataParser *data = [[DataParser alloc] init];
        data.delegate = self;
        [data loadSomething];

        dispatch_async(dispatch_get_main_queue(),
        ^{
            NSLog(@"Thread done");
        });
    });
}
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    theLabel.frame = CGRectMake(250,250,100,30);
    theLabel.text = @"This message displays fine";
}
-(void)loadMessage:(NSString *)message
{
    NSLog(@"Received message: %@", message);
    theLabel.frame = CGRectMake(300,300,100,30);
    theLabel.text = @"This message won't display";
}
@end

DataParser.h

@protocol DataParserDelegate;

@interface DataParser : NSObject
@property (weak, nonatomic) id <DataParserDelegate> delegate;
-(void)loadSomething;
@end

@protocol DataParserDelegate <NSObject>
-(void)loadMessage:(NSString *)message;
@end

DataParser.m

#import "DataParser.h"
@implementation DataParser
@synthesize delegate=_delegate;
-(void)loadSomething
{
    [[self delegate] loadMessage:@"ASDF"];
}
@end

-=-=-=-=-=-=-=-=-=-=-=-=-=-

基本的に、ラベルを作成して画面に追加します。この時点で、「Bob」と書かれた白いテキストが付いた青いボタンがはっきりと見えます。画面を回転させると、ボタンのテキストと位置がうまく変わります。ただし、ボタンをクリックすると、dataParser オブジェクトが作成され、デリゲートが自分自身に設定され、「loadSomething」が呼び出されます。dataParser オブジェクト内では、「loadSomething」はデリゲート メソッド「loadMessage」を呼び出すだけです。

問題は、「loadMessage」が呼び出されると、NSLog ステートメントが正しく出力される (「Received message: ASDF」) ことですが、theLabel は移動せず、そのテキストも変更しません。どうしてこれなの?そして、どうすればこの問題を解決できますか?

4

1 に答える 1

6

このコードを試してください:

-(void)loadMessage:(NSString *)message
{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Received message: %@", message);
        theLabel.frame = CGRectMake(300,300,100,30);
        theLabel.text = @"This message displays great!";
    });
}

メインスレッドで実行する必要があります。

于 2012-06-18T15:50:34.580 に答える