編集:時間を無駄にして申し訳ありません。エラーは私が取っていることとは何の関係もありませんでしたが、これが原因であると私に信じ込ませたコードのロジックです。ケビンのアイデアを使用して 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 の「レイヤー」がキャンバス上の絵の具のように重なり合っていることを理解しているので、私はこのちょっとしたことを言います。下のレイヤーと間違った情報を引き出します。