差异在类之间传递数据(Discrepancy in passing data between cla

2019-10-17 07:03发布

代码的第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. classBObject.textLabel.text = temp; // statement changed from Part 1. ,我已经错过了.text而复制粘贴。 请原谅我这一点。

Answer 1:

之所以说第二种技术是不正确的(除了丢失.text在年底textLabel )是,当你从B类初始化恢复,底层UILabel对应textLabel无疑还没有被创建。 如果你看一下这个图 ,你会看到的视图配置未在该初始化方法月底前完成,而是在访问。 所以,你必须推迟到用户界面控件的任何访问viewDidLoad


更新:

当我运行下面的代码,我得到“为0x0”在我的日志,证明了UILabel我的第二个观点依然是nil和尚未初始化,因为我本来期望。 当viewDidLoad在我的第二个控制器设置self.textLabel.text = self.dataToDisplayviewDidLoad ,它就像一个冠军(因为它为你)。 但UILabel IBOutlet属性是不可靠的,直到viewDidLoad

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

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

controller.dataToDisplay = @"from first view";

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


Answer 2:

您设置UITextLabel到的NSString。 尝试

classBObject.textLabel.text = temp;


Answer 3:

改变这一行...

    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.


Answer 4:

我注意到,您使用的是弱参考UILabelclassB接口。 你不使用任何理由strong参考? 要使用唯一的一次weak引用是为了避免保留周期。 最有可能的,你UILabel没有被保留。

你在哪里初始化UILabel



文章来源: Discrepancy in passing data between classes
标签: iphone ios xcode