如何使用另一个类中已有的对象?
e.g。有一个Class1的对象,并希望从Class2设置其变量。
一个人导入什么?是否只需要导入Class1,这会使对象可用于导入的类吗?
在一个班级,例如创建并呈现主类1
- (IBAction) openClass1 {
Class1 *c = [[Class1 alloc]initWithNibName:@"Class1" bundle:nil];
[self presentModalViewController:c animated:NO];
[c release];
}
然后Class1会有很多属性(我这里只做了一个)
@interface Class1 : UIViewController {
UIImageView *image;
}
@property(nonatomic, retain) UIImageView *image;
@end
我想编辑Class2中的Class1变量,然后关闭Class2视图并查看Class1中的更改。例如带有新文本的标签或带有另一个图像的UIImage等。
答案 0 :(得分:1)
再看一下这一行:
Class1 *c = [[Class1 alloc]initWithNibName:@"Class1" bundle:nil];
那么它的作用是创建一个Class1的实例。这是一个刚刚初始化的新实例。 c是指向该新实例的指针。
所以一旦你有c,你就可以发送c消息或访问c的属性。在您的示例中,您可以在上面的行之后执行类似的操作:
c.image = [UIImage imageNamed:@"foo.png"];
并且您还需要导入“Class1.h”,以便编译器确信Class1实际上具有名为“image”的属性。
重要的是要理解这里发生了什么。您没有导入对象。你创建一个对象,一个Class1的实例。然后为了说服编译器可以设置该属性,可以导入Class1.h,它告诉编译器所有的@属性和公共方法。
答案 1 :(得分:1)
这里有的是视图控制器类。您不应该假设另一个视图控制器已加载它的视图。应该允许视图控制器懒洋洋地加载它的视图,并且根据需要,这是Cocoa Touch的核心概念。
这意味着您不应直接从外部访问视图控制器视图或子视图(如UILabel
和UIImageView
)。
如果要配置要显示的视图控制器,您应该使用指定的初始化程序执行此操作。
您可以像这样创建Class1
:
@interface Class1 : UIViewController {
UIImage* imageToShow;
IBOutlet UIImageView* imageView;
}
-(id)initWithImage:(UIImage*)image;
@end
并按照以下方式实施:
@implementation Class1
- (id)initWithImage:(UIImage*)image {
self = [self initWithNibNamed:@"Class1" bundle:nil];
if (self) {
imageToShow = [image retain];
}
return self;
}
- (void)dealloc {
[imageToShow release];
[super dealloc];
}
- (void)viewDidLoad;
imageView.image = imageToShow;
}
@end
然后从Class2
出示视图控制器Class1
,如下所示:
-(IBAction) openClass1 {
Class1 *c = [[Class1 alloc] initWithImage:[UIImage imageNamed:@"Test.png"]];
[self presentModalViewController:c animated:NO];
[c release];
}