在另一个视图控制器上使用@class和#import,这是什么意思?

8 浏览
0 Comments

在另一个视图控制器上使用@class和#import,这是什么意思?

我是Xcode的新手,正努力了解更多关于在Xcode中编码的知识。

所以,我正在尝试学习关于在objective C中的模型(模型操作)。

我对PhotoViewController.h和.m文件中的@Class声明感到困惑。

正如您下面所看到的,我已经在appdelegate.m和PhotoViewController.m文件中导入了Photo.h。

我的教程目标是使PhotoViewController.m文件能够识别self.photo.filename。

但是,为什么必须在PhotoViewController.h文件中添加@Class和@property?

不是#import命令已经足够了吗?@Class是什么意思,为什么还要包含@property?

注意:我尝试在@class后面加上注释(//),但是Xcode告诉我找不到photo属性,当我在属性上加上注释(//)时,PhotoViewController.m文件也出现了无法识别的photo属性的问题。

我不太明白同时使用@class和#import的用法,再加上声明@property photo的意义是什么。

以下是Photo.m的代码:

#import "Photo.h"
@implementation Photo
-(id)init
{
    self = [super init];
    return self;
}
@end

以及

Photo.h的代码:

#import 
@interface Photo : NSObject
@property (weak, atomic) NSString *title;
@property (strong, nonatomic) NSString *detail;
@property (strong, nonatomic) NSString *filename;
@property (strong, nonatomic) NSString *thumbnail;
@end

Appdelegate.m的代码:

#import "AppDelegate.h"
#import "FeedTableViewController.h"
#import "ProfileViewController.h"
#import "FavoritesViewController.h"
#import "Photo.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    Photo *photo= [[Photo alloc]init];
    photo.title = @"Demo Photo";
    photo.detail = @"This is a demo photo";
    photo.filename = @"demo.png";
    photo.thumbnail = @"demo-thumb.png";
    return YES;
}
@end

PhotoViewController.h文件的代码:

#import 
@class Photo;
@interface PhotoViewController : UIViewController
@property (weak, nonatomic) NSString *imageFileName;
@property (weak, nonatomic) NSString *imageTitle;
@property (strong, nonatomic) Photo *photo;
@end

PhotoViewController.m文件的代码:

#import "PhotoViewController.h"
#import "UIImageView+AFNetworking.h"
#import "Photo.h"
@implementation PhotoViewController
-(void)viewDidLoad {
//    self.title = self.imageTitle;
    UIImageView *imageView = [[UIImageView alloc] init];
    [imageView setImageWithURL:[UIImage imageNamed:self.photo.filename]];
    imageView.frame = CGRectMake(10,10,300,300);
    [self.view addSubview:imageView];
    UILabel *imageTitleLabel = [[UILabel alloc] init];
    imageTitleLabel.text = self.imageTitle;
    imageTitleLabel.frame = CGRectMake(11,320,300,40);
    [self.view addSubview:imageTitleLabel];
}
@end

0
0 Comments

问题出现的原因是在另一个视图控制器中使用了@class和#import。这是因为当你想要替换getter方法时,你必须将变量声明为属性,这样就不需要单独编写getter方法。在Photo.m中也应该实现setter方法。

解决方法是在另一个视图控制器的头文件中使用@class关键字来引用Photo类,然后在实现文件中使用#import关键字来导入Photo类的头文件。这样就可以在另一个视图控制器中使用Photo类的属性和方法了。

下面是相应的代码示例:

在另一个视图控制器的头文件中:

@class Photo;

@interface AnotherViewController : UIViewController

@property (nonatomic, strong) Photo *photo;

@end

在另一个视图控制器的实现文件中:

#import "AnotherViewController.h"

#import "Photo.h"

@implementation AnotherViewController

// 使用Photo类的属性和方法

@end

通过使用@class和#import,我们可以在另一个视图控制器中使用Photo类的属性和方法,而不需要单独编写getter和setter方法。这样可以简化代码并提高代码的可读性和可维护性。

0
0 Comments

#import是Objective-C中的一个指令,它的作用是将指定的文件导入到当前的文件中。在这个问题中,#import "Photo.h"是将Photo.h文件导入到PhotoViewController.h文件中。

@class是Objective-C中的一个指令,它的作用是声明一个类的存在,但不导入类的定义。在这个问题中,@class Photo是在PhotoViewController.h文件中声明了Photo类的存在。

这样做的原因是为了避免循环引用。循环引用是指两个或多个类相互引用对方的头文件,导致编译错误。在这个问题中,PhotoViewController.h和Photo.h相互引用对方的头文件,如果直接在PhotoViewController.h中导入Photo.h,会导致循环引用。

解决方法是使用@class声明Photo类的存在,然后在PhotoViewController.m文件中使用#import "Photo.h"导入Photo.h文件。这样做可以避免循环引用,并且在PhotoViewController.m中可以使用self.photo来访问Photo类的实例变量。

0