Einen Delegaten hinzufügen, um eine custom UITableViewCell (bad access error)

Ich versuche, fügen Sie einen benutzerdefinierten Delegaten zu einer custom UITableViewCell von mir.

Auf diese Zelle habe ich eine Schaltfläche, die müssen Feuer eine Methode im ViewController, wo die UITableView befindet.

Bin ich dabei alle üblichen Schritte zum hinzufügen eines benutzerdefinierten Delegaten, aber aus irgendeinem Grund, wenn ich öffnen Sie die VC auf Laufzeit stürzt die app und gibt mir einen bösen Fehler beim Zugriff.

Wenn ich Kommentar alle Delegierten code, es funktioniert einwandfrei also meine Vermutung ist, dass etwas falsch ist die Art, wie ich meine delegieren. Wenn ich mein id-Eigenschaft unkommentierte es scheint zum Absturz zu bringen.

Implementiere ich das Protokoll im VC. Ich Tat weisen die Delegierten auf die Zelle, in der cellForRowAtIndexPath:. Alle die delegate-Methoden vorhanden sind.
Ich habe mit ähnlichen Konstruktionen in anderen Klassen, aber nie in einer Unterklasse von UITableViewCells vor.

Bevor ich poste etwas code würde ich gerne wissen, ob jemand begegnet dieser Fehler vor. Ob und wie er es gelöst, oder wenn es ist auch möglich einen benutzerdefinierten Delegaten für eine UITableViewCell Unterklasse.


EDIT:

Meine 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 implementiert die Delegierten als in der richtigen .h

@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll>

und es nutzt auch eine delegatemethod von MyTableCellProtocoll in der .m

- (void)didPressButton:(MyTableViewCell *)theCell
{
    NSLog(@"didPressButton");
}

Ich weisen Sie die Delegierten in der cellForRowAtIndexPath:

- (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;
}

Diese sind alle Orte, die ich verwenden für die Stellvertretung.
Was ich will, es zu tun ist, ändern Sie die buttontitle und fügen Sie einige Zeilen nach, die Zelle (modifiziert Duplikate)

Hoffe, das wird klar, die Dinge ein wenig mehr.


EDIT2:
Die button-Methode wird nicht aufgerufen am start, da war metioned in den Kommentar-Abschnitt. Editierte code mit logcode.


EDIT3:
Es ist nichts falsch mit der-Taste. Es ist die delegate-Eigenschaft, die ist Durcheinander irgendwo. Mit breakpoints und Protokolle und Kommentare, die ich gemacht sicher.

Der code wird ausgeführt, bis das Letzte element in meinem datasource Liste dann stürzt es ab. 1 Schritt näher an das problem jetzt, nehme ich an.


LETZTE EDIT:
Ok, es scheint, wie alle von den Delegierten und Schaltflächen und andere Komponenten waren nicht das problem. Es war die heightForRowAtIndexPath: Verschraubung mir vorbei.
Vielen Dank für Ihre Unterstützung sowieso!

  • Kann nicht kommentieren, ohne den code. Aber ja, eine UITableViewCell können einen UIViewController als Delegierter - dein problem klingt wie die standard-falsche Verwendung von Delegaten. Und delegation... vielleicht nicht die beste Lösung, je nachdem.
  • Es gibt keinen Grund, warum sollte es unmöglich sein, die zum erstellen eines delegate-Protokoll und id<Protokoll> ivar in ein NSObject Unterklasse (die UITableViewCell ist)
  • Ich bearbeitet die Frage mit einigen meiner code. Diese Orte haben die Nutzung meiner Stellvertretung Aktionen. Hoffe, es hilft.
  • Und... wo ist die SCHLECHTE-ZUGRIFF auftreten, und ich vermute, die buttonAction Methode kann aufgerufen wird, von der init-irgendwie. Lohnt sich die Umsetzung von einigen code zu überprüfen (eine NSLog).
  • Es scheint der Augenblick, in dem er laden möchte, ein tablecell in der Tabelle. Da ist eine leere Tabelle nicht Abstürzen. Hinzufügen eines Elements oder die Beladung mit Elemente in es macht ihn zum Absturz zu bringen. Die guten alten debugger nicht geben Sie mir die genaue Stelle des Absturzes -_-' Auch den button wird nicht aufgerufen, eine log-in und es nicht zeigen, bis.
  • Der code wird ausgeführt, bis das Letzte element in meinem datasource Liste dann stürzt es ab. 1 Schritt näher an das problem jetzt, nehme ich an.
  • Ich glaube, Sie brauchen einen Haltepunkt (möglicherweise in cellForRowAtIndexPath) und finden Sie heraus, wo genau Sie sind, abzustürzen, sonst werden wir alle gehen, um weiter zu werfen, die Rückschlüsse auf Sie 🙂
  • In dem moment stürzt es ab, nachdem er zurück, der 5. (und Letzte element) einige hardcoded datasource array. Nach, dass es die Schritte durch heighForRowAtIndexPath: und gibt eine Last von Assembler-code.
  • Nun, es scheint die heightForRowAtIndexPath: Einen hartcodierten Wert, es gibt mir einen sauberen laden. Mit dem delegieren normal läuft. Ich änderte den code und es funktioniert jetzt. Vielen Dank für all euren support aber!
  • Der einzige Grund, warum ich up stimmten diesem Q&A thread ist, dass ich bin auf der Suche nach einrichten der delegate-Protokolle auf UITableViewCell Objekte. Super!!!

Schreibe einen Kommentar