无法从课堂外访问UIView的“中心”属性

时间:2012-10-31 22:22:40

标签: objective-c ios uiview properties

我有一个UICollectionViewCell的实例(我们称之为c)。 c的属性child类型为B*

@property (strong) B* child;

B中有一个声明

@property (strong) C* parent;

C.m中设置了

self.child.parent = self

B.m我有代码:

position = self.parent.center.x;

由于某种原因,我无法从实例外部访问UIVIew的center属性。它是私人的吗?我查看了UIView.h和文档。我不认为它是私人的。

访问self.parent中的B.m给了我正确的值......

为什么我无法访问它?在C.m

self.center

按预期工作......

编辑:使用真实代码

这就是所谓的“C.h”

#import <UIKit/UIKit.h>
#import "UIMovableImage.h"

@interface LetterCollectionCell : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UIImageView *letterCellView;

@end

这是“B.h”

#import <UIKit/UIKit.h>

@class LetterCollectionCell;

@interface UIMovableImage : UIImageView
{
    CGPoint currentPoint;
}
@property (strong) LetterCollectionCell* parent;

@end

这是“C.m”

#import "LetterCollectionCell.h"
#import "LettersCollection.h"

@implementation LetterCollectionCell

-(void)PrepareImage:(int)index Hint:(BOOL)hint Rotate:(BOOL)rotate
{
    if ([_letterCellView respondsToSelector:@selector(parent)])
    {
       UIMovableImage* temp = ((UIMovableImage*)self.letterCellView);
       temp.parent = self;
    }     
}    

@end

这是“B.m”

#import "UIMovableImage.h"
#import "LetterCollectionCell.h"

@implementation UIMovableImage

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
        // Get active location upon move
        CGPoint activePoint = [[touches anyObject] locationInView:self.parent];

        // Determine new point based on where the touch is now located
        CGPoint newPoint = CGPointMake(self.parent.center.x + (activePoint.x - currentPoint.x),
                                       self.parent.center.y + (activePoint.y - currentPoint.y));

 }
@end

请注意,LetterCollectionCell的letterCellView的类型为UIImageView,而不是UIMovableImage类型。原因是我希望将此声明保留为占位符。在Interface Builder中,我有两个使用LetteCollection的场景。在一个场景中,我将imageview设置为UIMovableImage(通过Inspector Window),另一个场景我将图像保留为UIImageView类型。因此,运行时将在不同的场景上创建正确的类,并在我检查的集合中:如果图像具有属性“parent” - 我进行了设置。否则我不会。 它工作正常,分配工作正常....但访问不是

3 个答案:

答案 0 :(得分:4)

您无法访问该属性的唯一原因是该类不知道它(前向声明)。因此,您必须在B的实施文件中缺少#import "C.h"

或许有一个例子可以安抚downvoter,所以让我们使用你的:

这是B的标题应该是什么样的

//Give us the ability to subclass UICollectionViewCell without issue
#import <UIKit/UIKit.h>

//forward declare a reference to class B.  We cannot access it's properties until we
//formally import it's header, which should be done in the .m whenever possible.
@class B;

@interface C : UICollectionViewCell

//Declare a child property with a strong reference because we are it's owner and creator.
@property (strong, nonatomic) B* child;

@end

现在是C的标题。

//import foundation so we can subclass NSObject without a problem.
#import <Foundation/Foundation.h>

//Forward-declare classe C so we don't have to #import it here
@class C;

@interface B : NSObject

//keep an unretained reference to our parent because if the parent and the child have
//strong references to each other, they will create a retain cycle.
@property (unsafe_unretained, nonatomic) C* parent;

@end

现在已经不在了,这里是您最有可能使用的C的实现:

#import "C.h"
#import "B.h"

@implementation C

-(id)init {
    if (self =  [super init]) {
        self.child = [[B alloc]init];
        self.child.parent = self;
    }
    return self;
}

@end

还不错,但这就是问题所在:

#import "B.h"

@implementation B

-(id)init {
    if (self = [super init]) {
        CGFloat position = self.parent.center.x; //ERROR!
    }
    return self;
}

@end

因为C只声明它具有center属性(或者它的超类具有center属性),并且C的类型在Ch文件中,所以B不知道C的属性明确的#import Ch

答案 1 :(得分:1)

我找到了原因。 整个问题是在错误的树上吠叫。 实际上,错误发生在另一个地方,我只是在调试器的监视窗口中查看“无效表达式”。

总结一下:访问“中心”属性只是在原始问题中描述的情况下找到了。调试器的“无效表达式”和不同地方的错误使我追错了。

我+ 1d一般正确的答案和评论但不能接受它们,因为它可能误导人。

感谢大家的帮助和努力

答案 2 :(得分:-1)

根据你的问题的顺序,在我看来,你开始设置Cm但在该行代码上尚未设置子实例..那self.child = nil所以设置self.child.parent = self将不会给你任何结果......因此在Bm上将无法访问父对象......

如果我是正确的,只需设置你的子实例对象 - self.child = B * ---然后再设置self.child.parent = self ......