我有一个以编程方式加载为子视图的视图。该视图具有在.h中定义的三个属性,并在.m中合成。通过在父控制器中创建视图的对象然后调用它的初始化函数来加载视图。在初始化函数中,我将多个值设置为它们各自的属性。由于某种原因,我无法访问初始化函数之外的属性。我的第一个想法是,属性定义不正确,但在搞乱其强弱属性之后没有任何改变。
UIView的.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <Parse/Parse.h>
@protocol subViewDelegate
- (void)photoFromSubview:(NSInteger *)imageId;
- (void)downloadData;
@end
@interface ImageViewer : UIView
@property (nonatomic, assign) id <subViewDelegate> delegate;
//three properties
@property (nonatomic, copy) UIImage *mainImage;
@property (nonatomic, copy) UIViewController *parentView;
@property (nonatomic) NSInteger imageId;
- (void)removeImageViewer;
- (void)captureImage:(id)sender;
- (void)uploadPhoto:(id)sender;
- (UIImage *)addBackground;
- (ImageViewer *)loadImageIntoViewer:(UIViewController *)superView imageToLoad:(UIImage *)imageToLoad imageId:(NSInteger *)imageId;
@end
UIViews .m
中的相关功能//implementation of the properties
#import "ImageViewer.h"
#import "SpinnerView.h"
@implementation ImageViewer : UIView
{
}
@synthesize mainImage = _mainImage;
@synthesize parentView = _parentView;
@synthesize imageId = _imageId;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
}
return self;
}
//initialization function
- (ImageViewer *)loadImageIntoViewer:(UIViewController *)superView imageToLoad:(UIImage *)imageToLoad imageId:(NSInteger *)imageId
{
//create a new view with the same frame size as the superView
ImageViewer *imageViewer = [[ImageViewer alloc] initWithFrame:superView.view.bounds];
imageViewer.delegate = superView;
//three properties assigning values
_mainImage = imageToLoad;
_parentView = superView;
_imageId = imageId;
//if something's gone wrong, abort!
if(!imageViewer)
{
return nil;
}
//add all components and functionalities to the program
//when I use _mainImage bellow it works with the correct value
UIImageView *background = [[UIImageView alloc] initWithImage:[imageViewer addBackground]];
background.alpha = 0.85;
[imageViewer addSubview:background];
[imageViewer addSubview:[imageViewer addImageToView:_mainImage superView:superView.view]];
[imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 10.0) yPos:(superView.view.bounds.origin.x + 10.0) buttonAction:@selector(back:) buttonTitle:@"Back"]];
[imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 10.0) yPos:((superView.view.center.y/2) + 270.0) buttonAction:@selector(captureImage:) buttonTitle:@"Camera"]];
[imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 105.0) yPos:((superView.view.center.y/2) + 270.0) buttonAction:@selector(uploadPhoto:) buttonTitle:@"Upload"]];
[superView.view addSubview:imageViewer];
return imageViewer;
}
上面的代码允许您访问分配给_mainImage,_parentView和_imageId的值。但是当我尝试通过.m中定义的私有函数访问它们时,返回初始化值,如下所示。
- (void)uploadPhoto:(id)sender
{
//These all return as empty or uninitialized
NSLog(@"%@", _mainImage);
NSLog(@"%d", _imageId);
}
这是为什么?我是否在.h中错误地定义了属性,还是因为self不引用loadImageIntoViewer中定义的ImageView实例?我该如何解决这个问题?
答案 0 :(得分:1)
一些想法:
首先,假设您正在使用最新版本的XCode,则不需要再声明@synthesize
语句。编译器会自动为您插入合成语句,并创建附加下划线的实例变量(就像您所做的那样)。
其次,当你说'无法访问初始化函数之外的属性'时 - 你的意思是当你试图访问属性时你得到一个糟糕的访问权限,或者他们只是返回nil?我不确定你是说你的意思,因为看你当前的初始化方法,你当前根本没有访问属性,只有实例变量。
我认为你可能会混淆实例变量和属性。 Objective-C中的属性如下所示:
NSLog(@"%@", self.mainImage);
...你的app结构对我来说也有点混乱。您的初始化方法是一个实例,而不是类,方法,因此您只需创建一个ImageViewer
,然后再创建另一个ImageViewer
。我建议你尝试创建一个真正的init方法,一个调用initWithFrame
的方法。我想也许您可能会发现查看Apple的介绍Objective-C文档很有帮助,因为我不认为您的应用程序的结构可以帮助您调试问题。