在另一个视图控制器上使用@class和#import,这是什么意思?
在另一个视图控制器上使用@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
问题出现的原因是在另一个视图控制器中使用了@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方法。这样可以简化代码并提高代码的可读性和可维护性。
#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类的实例变量。