该代码的第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
中删除ClassB
,textLabel
的视图控制器上的ClassB
不会更新。您能否提出建议,为什么呢?谢谢!
编辑1:
在语句
classBObject.textLabel.text = temp; // statement changed from Part 1.
中,我在复制粘贴时错过了.text
。请原谅我。 最佳答案
第二种技术不正确的原因(除了.text
末尾缺少的textLabel
之外)是,当您从B类初始化程序返回时,无疑尚未创建与UILabel
对应的基础textLabel
。如果查看此diagram,您将看到在初始化方法结束时视图配置并未完成,而是在访问时完成。因此,必须将对用户界面控件的所有访问推迟到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];
关于iphone - 类之间传递数据的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12762846/