问题1)
我有一个基于导航的应用程序,点击一个条目会打开第二个视图,其中包含该条目的详细信息。
现在正在使用以下代码
[self.navigationController pushViewController:descriptionController animated:YES];
[self.descriptionController.textView setText:[s description]];
self.descriptionController.title = [s name];
但是,如果我切换第一个和第三个语句,那么当我第一次点击某个项目时,详细信息视图会显示Lorem Ipsum文本。在第一次之后,它按预期工作。我认为这样做会更正确。为什么它会在第一个视图中显示Lorem Ipsum,但之后不会显示任何内容?
问题2)
此外,我的textView元素是详细信息视图的一部分。在我的控制器类中,我有:
@property( nonatomic, retain) IBOutlet UITextView *textView;
但如果我将其更改为
@property( nonatomic, copy) IBOutlet UITextView *textView;
然后它崩溃了。我不认为它会崩溃,但我认为它只是创建新的实例,只是占用内存。有人可以解释一下吗?
答案 0 :(得分:7)
问题是 - [UIViewController视图]及其所有子视图都是懒惰填充的,可以是来自NIB,也可以是在loadView中以编程方式填充。所以:
//At this point descriptionController.view == nil && textView == nil
[self.navigationController pushViewController:descriptionController animated:YES];
//At this point descriptionController.view and textView are set
[self.descriptionController.textView setText:[s description]];
self.descriptionController.title = [s name];
因此,如果您按下交换推送(加载视图)之后的其他行“
[self.descriptionController.textView setText:[s description]];
self.descriptionController.title = [s name];
//At this point descriptionController.view == nil && textView == nil
[self.navigationController pushViewController:descriptionController animated:YES];
//At this point descriptionController.view and textView are set
您正在将设置消息发送到nil值(不执行任何操作),然后使用其默认值加载视图。
答案 1 :(得分:5)
在我的视图的控制器类中:
@property( nonatomic, retain) IBOutlet UITextView *textView;
但如果我将其更改为
@property( nonatomic, copy) IBOutlet UITextView *textView;
然后它崩溃了。
因为UITextView不符合NSCopying。