1

編集:時間を無駄にして申し訳ありません。エラーは私が取っていることとは何の関係もありませんでしたが、これが原因であると私に信じ込ませたコードのロジックです。ケビンのアイデアを使用して AuthorSelectionView 全体を渡し、NSNumer の間違いを修正したことについて、ケビンに正しい答えを与えます。申し訳ありません。

私はこれを何時間も理解しようとしてきましたが、1日放置してもまだわかりません...

私の状況は次のとおりです。

「UIView」を実装するカスタム クラスを作成し、このクラスを次のようにプロトコルにしました。

カスタム UIView h ファイル

@protocol AuthorSelectionViewDelegate <NSObject>
-(void)AuthorSelected:(NSNumber *)sender;
@end

#import <UIKit/UIKit.h>

@interface AuthorSelectionView : UIView

@property (nonatomic,assign) id<AuthorSelectionViewDelegate> delegate;

@property (strong,retain) NSNumber *authorID;

- (id)initWithFrame:(CGRect)frame withImage:(UIImage *)img withLabel:(NSString *)lbl withID:(int)authorID ;

@end

実装...

    - (id)initWithFrame:(CGRect)frame withImage:(UIImage *)img withLabel:(NSString *)lbl withID:(int)authorID
    {
        self = [super initWithFrame:frame];
        if (self) {
            self.authorID = [[NSNumber alloc] initWithInt:authorID]; //used to distinguish multiple instances of this class in a view.

            ...

        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, FRAMEWIDTH, FRAMEHEIGHT)];
        [button addTarget:self action:@selector(CUSTOMBUTTONCLICK) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
    }
return self;
}

    - (void) CUSTOMBUTTONCLICK
    {
        [self.delegate performSelector:@selector(AuthorSelected:) withObject:self.authorID];
    }

これで、デリゲート オブジェクトのメソッドが正常に呼び出されますが、ここでの主な問題は、AuthorSelected クラスの複数のインスタンスが割り当てられている場合に、パス スルーされるオブジェクトで何かが起こっていることです .. (NSNumber authorID)。私はそれで奇妙な振る舞いをしています。値が渡されるとほぼランダムに見えますが、渡された値が遅れて現れるパターンを検出しています..

わかりにくいので説明しません。AuthorSelected ビューの 2 つのインスタンスを作成します。1 つは authorID=1 で、もう 1 つは authorID=2 です。

最初のボタンを押すと、最初のボタンを押すと、期待どおりに 1 が表示されます。

2 回目のプレスでは、1 つ目のカスタム ボタンを押すと「1」が表示されますが、2 回目のボタンを押すと 1 になります。

3 回目は、どちらのボタンを押しても「2」が返されます

これは常に私にとって弱点だったので、これはポインターの問題だと思いますが、これを理解できないように見えるので、どんな助けでも大歓迎です。

ありがとうございました!

編集:

as requested here is how I create the AuthorSelectionView Objects...

AuthorSelectionView * asView01 = [[AuthorSelectionView alloc]
initWithFrame:CGRectMake(0, 0, FRAMEWIDTH, FRAMEHEIGHT)
withImage:userPic1
withLabel:randomUserName
withID:1];

asView01.delegate = self;

AuthorSelectionView * asView02 = [[AuthorSelectionView alloc]
initWithFrame:CGRectMake(0, 0, FRAMEWIDTH, FRAMEHEIGHT)
withImage:userPic2
withLabel:randomUserName2
withID:2];

asView02.delegate = self;

重要な詳細:

これらのカスタム ビューのいずれかをクリックするとすぐに、私のコードは (今のところ) 上記の AuthorSelectionView 割り当てコードを実行するメソッドを呼び出すように設定されているため、同じレイアウトで画面を更新できますが、userpic/userName は異なります。 . これは設計が悪いことはわかっていますが、今のところ、基本的な機能を機能させたいだけで、再描画について心配します. Objective-C の「レイヤー」がキャンバス上の絵の具のように重なり合っていることを理解しているので、私はこのちょっとしたことを言います。下のレイヤーと間違った情報を引き出します。

4

3 に答える 3

1

問題の説明は少し混乱していますが、あなたのこの行initは明らかに間違っています:

self.authorID = [self.authorID initWithInt:authorID];

では-init、プロパティのself.authorIDデフォルトはnilであるため、式[self.authorID initWithInt:authorID]は と同等で[nil initWithInt:authorID]あり、これは に評価されnilます。したがって、あなたは実際nilにあなたの行動を見ているべきです。あなたはおそらく言うつもりだったself.authorID = [NSNumber numberWithInt:authorID]

于 2013-01-08T20:11:38.450 に答える
0

alloc メッセージがないため、次のメッセージが表示されます。

self.authorID = [self.authorID initWithInt:authorID]; 

self.authorID がまだ割り当てられていないため、nil ターゲットに送信されます。

したがって、最初に割り当ててから init メソッドを使用するか、これら 2 つのメッセージを混ぜてください。より高速な構文では、次のようにすることができます。

self.authorID= @(authorID);

編集

デリゲートを初期化する場所がわかりません。初期化していない場合、そのメソッドを呼び出すことさえできません。AuthorSelectionView オブジェクトを作成してデリゲートを設定するコードを示します。

于 2013-01-08T20:16:04.217 に答える
0

それ以外の :

self.authorID = [self.authorID initWithInt:authorID];

置く :

self.authorID = [NSNumber numberWithInt:authorID];

また

self.authorID = [[NSNumber alloc] initWithInt:authorID];

編集 :

コードにエラーや警告はありませんか? init メソッド ("return self;") で self オブジェクトを返す様子が見られません。

于 2013-01-08T20:11:48.487 に答える