1

コードのパート 1 は正常に動作します。パート 2 では、コードが期待どおりに (エラーや警告なしで) 動作しなくなる原因となる、コードの小さな変更を示します。

パート 1: (作品)

#import "ClassA.h"
#import "ClassB.h"

@implementation ClassA

- (void) sendData
{
    NSString *temp = [NSString stringWithFormat:@"HI!"];
    ClassB *classBObject = [[ClassB alloc] init];
    classBObject.dataToDisplay = temp;
    self.view = classBObject.view;
}

@end

ClassB のインターフェース:

#import <UIKit/UIKit.h>

@interface ClassB : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property NSString * dataToDisplay;

@end

ClassB の実装:

#import "ClassB.h"

@implementation ClassB

@synthesize dataToDisplay, textLabel;

- (void)viewDidLoad
{
    [super viewDidLoad];

    textLabel.text = dataToDisplay;
}

@end

パート2:

しかし- (void)sendData、ClassAを次のように変更すると:

- (void) sendData
    {
        NSString *temp = [NSString stringWithFormat:@"HI!"];
        ClassB *classBObject = [[ClassB alloc] init];
        classBObject.textLabel.text = temp; // statement changed from Part 1.
        self.view = classBObject.view;
    }

から削除textLabel.text = dataToDisplay;するimplementationClassB、のtextLabelビューコントローラーはClassB更新されません。なぜそうなのか教えてください。

ありがとう!

編集1:

ステートメントで: 、コピー貼り付け中classBObject.textLabel.text = temp; // statement changed from Part 1.に見逃していました。.text失礼いたします。

4

4 に答える 4

3

.text2番目の手法が正しくない理由(の最後に欠落してtextLabelいることを除く)は、クラスB初期化子から戻ったときに、間違いなくにUILabel対応する基になるtextLabelものがまだ作成されていないためです。このを見ると、初期化メソッドの最後ではなく、アクセス時にビューの構成が完了していることがわかります。したがって、ユーザーインターフェイスコントロールへのアクセスは、まで延期する必要がありますviewDidLoad


アップデート:

次のコードを実行すると、ログに「0x0」が表示され、予想どおりUILabel、2番目のビューのがまだnil初期化されていないことを証明します。私viewDidLoadの2番目のコントローラーがに設定self.textLabel.text = self.dataToDisplayされるとviewDidLoad、それはチャンピオンのように機能します(あなたの場合と同じように)。しかし、UILabel IBOutletプロパティはまで信頼できませんviewDidLoad

SecondViewController *controller = [[SecondViewController alloc] init];

NSLog(@"%p", controller.textLabel);

controller.dataToDisplay = @"from first view";

[self presentViewController:controller animated:YES completion:nil];
于 2012-10-06T19:18:10.650 に答える
1

UITextLabel を NSString に設定しています。試す

classBObject.textLabel.text = temp;
于 2012-10-06T19:03:11.923 に答える
1

この行を変更...

    classBObject.textLabel = temp; // statement changed from Part 1.

    classBObject.textLabel.text = temp; // statement changed from Part 1.

また、あなたはすべきです

    [self.view addSubView:classBObject.view]; //using navigation controller or presenting modal viewcontroller would be recommended.

それ以外の

    self.view = classBObject.view;

この行の後、ラベルのテキストを値で更新します。

    classBObject.textLabel.text = temp; // statement changed from Part 1.
于 2012-10-06T19:05:25.760 に答える
0

インターフェイスUILabelでへの弱い参照を使用していることに気付きました。classB参照を使用しない理由はありますstrongか? 参照を使用するのweakは、保持サイクルを回避する場合のみです。ほとんどの場合、あなたUILabelは保持されていません。

どこで初期化しますUILabelか?

于 2012-10-06T19:48:07.317 に答える