私のカスタムUITableViewCellにカスタムデリゲートを追加しようとしています。カスタムUITableViewCellにデリゲートを追加する(不正なアクセスエラー)
このセルには、UITableViewが配置されているViewControllerのメソッドを起動するボタンがあります。
カスタムデリゲートを追加するためのすべての通常の手順を実行していますが、何らかの理由でランタイムにVCを開いたときにアプリケーションがクラッシュし、不正なアクセスエラーが発生します。
私はすべてのデリゲートコードをコメントすると正しく動作するので、私の代理人を追加する方法が間違っていると思います。 idプロパティをコメントアウトしておくと、クラッシュするようです。
私はVCでプロトコルを実装します。私はcellForRowAtIndexPath:のセルにデリゲートを割り当てました。すべてのデリゲートメソッドが実装されています。 私は他のクラスでも同様の構造を使用していましたが、これまではUITableViewCellsのサブクラスではありませんでした。
私はいくつかのコードを投稿する前に、誰かがこのバグを以前に遭遇したかどうかを知りたいと思います。それがどうやって解決されたのか、またはUITableViewCellサブクラスのカスタムデリゲートを作ることさえ可能であるかどうか。
EDIT:
マイcustomCell.h
#import <UIKit/UIKit.h>
@class MyTableViewCell;
@protocol MyTableCellProtocoll <NSObject>
-(void) didPressButton:(MyTableViewCell *)theCell;
@end
@interface MyTableViewCell : UITableViewCell
{
UIButton *myButton;
id<MyTableCellProtocoll> delegationListener;
}
@property (nonatomic,retain) UIButton *myButton;
@property (nonatomic,assign) id<MyTableCellProtocoll> delegationListener;
- (void) buttonAction;
@end
.M
#import "MyTableViewCell.h"
@implementation MyTableViewCell
@synthesize myButton;
@synthesize delegationListener;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
self.myButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.myButton.backgroundColor = [UIColor clearColor];
self.myButton.frame = CGRectMake(5, 0, 10, 32);
self.myButton.titleLabel.adjustsFontSizeToFitWidth = YES;
[self.myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:self.myButton];
}
return self;
}
- (void) buttonAction
{
NSLog(@"buttonpressed");
[self.delegationListener didPressButton:self];
}
@end
MyVCが.hの中に適切なようにデリゲートを実装し
@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll>
、それはまた、私はcellForRowAtIndexPathでデリゲートを割り当てます.M
- (void)didPressButton:(MyTableViewCell *)theCell
{
NSLog(@"didPressButton");
}
にMyTableCellProtocollから1 delegatemethodを使用しています:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.delegationListener = self;
}
return cell;
}
これらは私がデリゲートのために使用するすべての場所です。 私がしたいことは、ボタンのタイトルを変更し、そのセルの後ろにいくつかの行を挿入することです(変更された複製)
これはもう少し明確になります。
EDIT2:コメント欄にmetionedたよう ボタン方式は、開始時に呼び出されていません。ログコード付きの編集コード。
EDIT3: ボタンに問題はありません。それは、どこかに混乱しているデリゲートプロパティです。ブレークポイントとログを使って、私はそれを確認しました。
コードがデータソースリストの最後の要素まで実行されていて、クラッシュします。今一番問題に近づいています。
FINAL EDITは: [OK]を、それは代表団とボタンとその他のコンポーネントのすべてのように思える全く問題ありませんでした。それはheightForRowAtIndexPathだった。とにかくあなたのサポートのおかげでよろしく!
コードなしでコメントすることはできません。しかし、はい、UITableViewCellは、デリゲートとしてUIViewControllerを使用することができます - あなたの問題はデリゲートの標準的な間違った使い方のように聞こえます。そして...委任は、最適な解決策ではないかもしれません。 –
NSObjectサブクラス(これはUITableViewCellです) – jbat100
で代理プロトコルとid ivarを作成することが不可能である理由はありません@PaulLynch:私はいくつかのコードで質問を編集しました。これらの場所には、代理アクションが使用されています。それが役に立てば幸い。 –