在Objective C中导入现有Object

时间:2010-10-23 12:11:48

标签: iphone objective-c

如何使用另一个类中已有的对象?

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等。

2 个答案:

答案 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的核心概念。

这意味着您不应直接从外部访问视图控制器视图或子视图(如UILabelUIImageView)。

如果要配置要显示的视图控制器,您应该使用指定的初始化程序执行此操作。

您可以像这样创建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];
 }