2011-11-09 7 views
9

私のカスタム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だった。とにかくあなたのサポートのおかげでよろしく!

+0

コードなしでコメントすることはできません。しかし、はい、UITableViewCellは、デリゲートとしてUIViewControllerを使用することができます - あなたの問題はデリゲートの標準的な間違った使い方のように聞こえます。そして...委任は、最適な解決策ではないかもしれません。 –

+0

NSObjectサブクラス(これはUITableViewCellです) – jbat100

+0

で代理プロトコルとid ivarを作成することが不可能である理由はありません@PaulLynch:私はいくつかのコードで質問を編集しました。これらの場所には、代理アクションが使用されています。それが役に立てば幸い。 –

答えて

4

この問題は解決されました。 問題はデリゲートではなく、他の回答のボタンの問題とは無関係です。問題は、heightForRowAtIndexpath内のセルのアクセスにありました:そして、一度考えれば簡単に解決されました。

私はjrturtonによって正しい方向に指さしてくれました。このために、彼には感謝しています。

+3

解決策を教えていただけますか? –

1

最初に、インターフェイスはMyTableViewCell、実装 - iPadCheckTableViewCellと呼ばれました。私は両方が同じ名前を持つべきだと思います。

そして、このようなボタンの作成:

self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; // instead of self.myButton = [[UIButton alloc] init]; - it's a memory leak 
+0

ああ、それは私のコードに同じ名前を持っています。それは単にタイプミスです。残念ながらエラーではありません。私はそれを編集しました^^ –

4

を私が合成されたアクセサはinit時に使用すべきではないと聞いたことがあります。直接アイバーズを使用して、すべてのセットアップコードを実行しよう:ベリリウムは当然示唆するように、あなたが[UIButton buttonWithType:UIButtonTypeCustom];にあなたのボタン作成を変更する場合は、あなたもそれretainにする必要があります

myButton = [[UIButton alloc] init];   
myButton.backgroundColor = [UIColor clearColor];   
myButton.frame = CGRectMake(5, 0, 10, 32);   myButton.titleLabel.adjustsFontSizeToFitWidth = YES;   
[myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];   
[contentView addSubview:myButton]; 

+0

ここでうんざりしているボタンではありません。ボタンが完全にコメントアウトされても、同じbad_accessエラーが表示されます。 –

関連する問題