代码的第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}}移除implementation
,ClassB
的视图控制器上的textLabel
未获得更新。你能建议,为什么会这样?
谢谢!
编辑1:
在声明:ClassB
中,我在复制粘贴时错过了classBObject.textLabel.text = temp; // statement changed from Part 1.
。请原谅我。
答案 0 :(得分:3)
第二种技术不正确的原因(除了.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];
答案 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
?