在类之间传递数据的差异

时间:2012-10-06 18:56:06

标签: iphone ios xcode

代码的第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;的{​​{1}}移除implementationClassB的视图控制器上的textLabel未获得更新。你能建议,为什么会这样?

谢谢!

编辑1:

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

4 个答案:

答案 0 :(得分:3)

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


<强>更新

当我运行以下代码时,我的日志中出现“0x0”,证明我的第二个视图上的UILabel仍然是nil并且尚未初始化,正如我预期的那样。当我的第二个控制器中的viewDidLoadself.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];

答案 1 :(得分:1)

您正在将UITextLabel设置为NSString。尝试

classBObject.textLabel.text = temp;

答案 2 :(得分: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.

答案 3 :(得分:0)

我注意到您在UILabel界面中使用了对classB的弱引用。您没有使用strong引用的任何原因?您希望使用weak引用的唯一时间是避免保留周期。最有可能的是,您的UILabel未被保留。

您在哪里初始化UILabel