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

B类接口:

#import <UIKit/UIKit.h>

@interface ClassB : UIViewController

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

@end

B类的实现:

#import "ClassB.h"

@implementation ClassB

@synthesize dataToDisplay, textLabel;

- (void)viewDidLoad
{
    [super viewDidLoad];

    textLabel.text = dataToDisplay;
}

@end

第2部分:

但是,如果我将- (void)sendDataClassA 更改为以下内容:

- (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请原谅我。

4

4 回答 4

3

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


更新:

当我运行以下代码时,我在日志中得到“0x0”,证明UILabel我的第二个视图仍然nil没有初始化,正如我所预料的那样。当viewDidLoad我的第二个控制器中的 设置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

我注意到您UILabelclassB界面中使用了对 的弱引用。你有什么理由不使用strong参考?您想使用weak引用的唯一时间是避免保留循环。最有可能的UILabel是,您没有被保留。

你在哪里初始化你的UILabel

于 2012-10-06T19:48:07.317 回答