该代码的第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部分:

但是,如果我将ClassA的- (void)sendData更改为以下内容:
- (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;implementation中删除ClassBtextLabel的视图控制器上的ClassB不会更新。您能否提出建议,为什么呢?

谢谢!

编辑1:

在语句classBObject.textLabel.text = temp; // statement changed from Part 1.中,我在复制粘贴时错过了.text。请原谅我。

最佳答案

第二种技术不正确的原因(除了.text末尾缺少的textLabel之外)是,当您从B类初始化程序返回时,无疑尚未创建与UILabel对应的基础textLabel。如果查看此diagram,您将看到在初始化方法结束时视图配置并未完成,而是在访问时完成。因此,必须将对用户界面控件的所有访问推迟到viewDidLoad为止。

更新:

当我运行以下代码时,我在日志中得到“0x0”,证明第二个视图上的UILabel仍然是nil,并且尚未初始化,这与我期望的一样。当我的第二个控制器中的viewDidLoadself.textLabel.text = self.dataToDisplay中设置viewDidLoad时,它就像是冠军(对您而言)。但是UILabelIBOutlet属性直到viewDidLoad才可靠。

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

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

controller.dataToDisplay = @"from first view";

[self presentViewController:controller animated:YES completion:nil];

关于iphone - 类之间传递数据的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12762846/

10-13 01:08