1

UICollectionViewCell私は(それを呼び出すことができます)のインスタンスを持っていますc。 タイプcのプロパティを持っていますchildB*

@property (strong) B* child;

その中Bに宣言があります

@property (strong) C* parent;

C.m私が設定した

self.child.parent = self

私はB.mコードを持っています:

position = self.parent.center.x;

何らかの理由centerで、インスタンスの外部から UIVIew のプロパティにアクセスできません。プライベートですか?UIView.h私はドキュメンテーションを調べました。私はそれがプライベートだとは思わない。

アクセスself.parentするB.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

これは「Cm」です。

#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

そして、これが「Bm」です

#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 が使用される 2 つのシーンがあります。あるシーンでは、イメージビューを UIMovableImage ( Inspector Window を介して) に設定し、別のシーンでは、イメージを UIImageView タイプのままにしました。したがって、ランタイムはさまざまなシーンで適切なクラスを作成し、コレクションでチェックします。画像に「親」プロパティがある場合は、それを設定します。そうでなければ私はしません。それはうまくいきます、割り当てはうまくいきます....しかし、アクセスはそうではありません

4

3 に答える 3

4

プロパティにアクセスできない唯一の理由は、クラスがそれを認識していないことです (前方宣言)。#import "C.h"したがって、 B の実装ファイルに欠落がある必要があります。

おそらく、反対票を投じた人をなだめるために例が必要なので、あなたのものを使用しましょう:

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(またはスーパークラスがプロパティを持っているというよりも)であり、Cの型がChファイルにあるため、BはChcenterの明示なしにCのプロパティを認識していません#import

于 2012-10-31T22:52:47.133 に答える
1

理由がわかりました。質問全体が間違った木に吠えていました。実際、バグは別の場所にあり、デバッガーのウォッチ ウィンドウで「無効な式」を見続けていました。

要約すると、「center」プロパティへのアクセスは、元の質問で説明されている状況でのみ機能しました。デバッガーの「無効な式」と別の場所のバグで、私は間違ったことを追跡しました。

私は一般的に正しい回答とコメントを +1 しますが、人々を誤解させる可能性があるため、それらを受け入れることはできません。

助けてくれてありがとう

于 2012-11-01T20:27:07.520 に答える
-1

According to the sequence of your question it seems to me that you start with setting the C.m but on that line code the child instance is not set yet.. that self.child = nil so setting self.child.parent = self will give you no result... Accordingly on B.m will not have the access to the parent object...

if i am correct just set your child instance object -- self.child = B* --- before set self.child.parent = self......

于 2012-10-31T22:49:03.320 に答える