2012-10-31 122 views
1

我有一個UICollectionViewCell(讓我們稱之爲c)的實例。 cB類型B*無法從類的外部訪問UIView的「中心」屬性

@property (strong) B* child; 

的財產child有一個聲明

@property (strong) C* parent; 
C.m

我設置

self.child.parent = self 

B.m我有代碼:

position = self.parent.center.x; 

由於某種原因,我無法從實例外訪問UIVIew的center屬性。它是私人的嗎?我查看了UIView.h和文檔。我不認爲它是私人的。

訪問self.parentB.m是給我正確的價值觀......

那麼爲什麼不能訪問它?在C.m

self.center 

按預期工作...

編輯:隨着真正的代碼

這就是所謂的 「CH」

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

@interface LetterCollectionCell : UICollectionViewCell 

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

@end 

這是「波黑「

#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類型。所以運行時會根據不同的場景和我檢查的集合創建適當的類:如果圖像有一個屬性「父」 - 我設置它。否則我不。 它工作正常,分配工作得很好....但訪問不是

+4

不要聲明的強引用'parent',它會創建一個保留週期。 – CodaFi

+1

謝謝,不知道這意味着什麼,但肯定會找出:) –

+0

我不明白你的問題,你的例子正確構建。 – CodaFi

回答

1

我找到了原因。整個問題都是在錯誤的樹上吠叫。 事實上,這個錯誤在其他地方,我只是一直在調試器的監視窗口中查看「Invalid Expression」。

綜上所述:在原始問題描述的情況下,訪問「中心」屬性只能找到工作。調試器的「無效表達式」和不同地方的錯誤讓我追逐了一個錯誤的東西。

我+ 1d通常正確的答案和評論,但不能接受他們,因爲它可能會誤導人。

感謝所有的幫助和努力

-1

根據你的問題的順序,我覺得你開始設置Cm,但在該行代碼子實例是還沒有設置.. that self.child = nil因此設置self.child.parent = self會給你沒有結果...因此Bm將無法訪問父對象...

如果我是正確設置你的子實例對象 - self.child = B * ---設置self.child.parent =自......

+1

-1這不是一個空引用的問題,它是一個無法訪問屬性的問題。 – CodaFi

+0

對不起,我確定我是按正確的順序設置的。我還說過訪問self.parent會給我正確的值,而self.parent.center在代碼中的相同位置會給出錯誤 –

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'S頭。

//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的原型C.h.沒有明確的#import

+0

小心解釋downvote?如果需要,我可以更徹底地證明我的迴應。 – CodaFi

+0

根據提問者提供的信息,此答案是正確的,而對於「父」的弱引用+1,原始代碼具有保留週期。 – yfrancis

+0

CodaFi,非常感謝您的評論。但我完全按照你的建議。我會在一兩分鐘內粘貼我的原始代碼,而不是僞C和B ... +1,以獲得更詳盡的答案。我想你對#import的原始陳述足以說明這一點。在這種情況下-1是不合理的,AFAIK –