0

私は初心者のiPhone開発者です。

私は2つのクラスを持っています。TestViewController(これは絵コンテのビューにリンクされています) とViewController.

クラスからのパラメータとしてメソッド( [tc refresh:val];TestViewControllerを呼び出そうとしています。に到達したログから確認できますが、何らかの理由でラベルが更新されず、ビューで設定したラベルの現在のテキストも取得できません。それは価値を与えます。私が取得したコードとログを参照してください。 からへのメソッドを呼び出して、ラベルを更新する方法を教えてください。valViewControllervalTestViewControllernullVCTVC

TestViewController.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface TestViewController : UIViewController

@property (retain, nonatomic) IBOutlet UILabel *lblDisp;

- (IBAction)chngText:(id)sender;
- (void)refresh:(NSString *)val;

@end

TestViewController.m

#import "TestViewController.h"
#import "ViewController.h"

@implementation TestViewController
@synthesize lblDisp;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"TEST VC LOADED");
    NSLog(@"TEXT CUrret VALUE SUPERVIEW %@",lblDisp.text);
}

- (IBAction)chngText:(id)sender {
    ViewController *dd=[[ViewController alloc]init];
    [dd display];
}

-(void)refresh:(NSString *)val{
    NSLog(@"Value of Val = %@",val);
    NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
    lblDisp.text=val;
}
@end

ViewController.h

#import <UIKit/UIKit.h>
#import "TestViewController.h"

@interface ViewController : UIViewController

-(void)display;

@end

ViewController.m

#import "ViewController.h"
#import "TestViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"VC LOADED");
}

-(void)display{
    NSLog(@"Reached VC");
   NSString *val=@"1";
    TestViewController *tc=[[TestViewController alloc]init];
    [tc refresh:val];
}

@end

ログ

2013-07-24 03:13:36.413 Simple test[38477:11303] TEST VC LOADED
2013-07-24 03:13:36.415 Simple test[38477:11303] TEXT CUrret VALUE SUPERVIEW sdfgdfgd
2013-07-24 03:13:37.909 Simple test[38477:11303] Reached VC
2013-07-24 03:13:37.910 Simple test[38477:11303] Value of Val = 1
2013-07-24 03:13:37.911 Simple test[38477:11303] TEXT CUrret VALUE (null)
4

2 に答える 2

4

あなたの問題は、値を返す方法にあります。

TestViewController *tc=[[TestViewController alloc]init];
[tc refresh:val];

tc最初の行は、TestViewControllerクラスの新しいインスタンスを作成して初期化します。これにより、そのメソッドにアクセスできますが、最初に作成したインスタンスや最初に割り当てたデータにアクセスしているわけではありません。これは、新しいインスタンスのlblDisp残りのプロパティとともに、 label が nil であることを意味します。TestViewController

基本的に、この戦略を使用してデータをやり取りすることはできません。このSO投稿を参照してください:

ビュー コントローラ間でのデータの受け渡し

于 2013-07-24T14:48:34.280 に答える
2

問題はかなり単純です

  -(void)refresh:(NSString *)val{
        NSLog(@"Value of Val = %@",val);
        NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
        lblDisp.text=val;
    }

ここでは、ログが出力された後に値が更新されるため、最初にラベルが更新されてから値をログに記録する順序でコードを変更します

だから使う

  -(void)refresh:(NSString *)val{
        lblDisp.text=val;
        NSLog(@"Value of Val = %@",val);
        NSLog(@"TEXT CUrret VALUE %@",lblDisp.text);
    }

編集

その理由はlblDisp、ペン先からロードされ、ビューが表示/プッシュされるまで有効なメモリではない可能性があります.そして、メソッドのみが有効なラベルインスタンスを持ち、それを更新できるのはあなただけです.

于 2013-07-24T11:35:11.090 に答える