2 Stimmen

Wie man eine Ansicht aus einer UITableViewCell schiebt

Ich habe eine UITableViewController die benutzerdefinierte Zellen hat, die ich mit meiner eigenen Unterklasse angepasst habe. In dieser Unterklasse habe ich eine Schaltfläche hinzugefügt und ich möchte eine Ansicht in den Stapel des Navigationscontrollers schieben. Ich habe keine Ahnung, wie ich das anstellen soll, da ich nicht weiß, wie ich von meiner benutzerdefinierten Zelle aus auf den Navigationscontroller zugreifen kann.

Irgendeine Idee?

5voto

calimarkus Punkte 9830

Ich brauche hier mehr Informationen. Welche Klasse enthält die Tabelle, welche Klasse ist der Tableview-Delegat?

Im einfachsten Fall arbeiten Sie in einer einzigen Klasse. Dann wäre es [self.navigationController pushViewController: xyz] .

Aber wenn Sie Ihre eigene subclassed UITableViewCells haben, dann müssen Sie zwischen der Zelle Klasse und der Viewcontroller kommunizieren. Sie könnten dies über die Einstellung einer Eigenschaft in der Zellklasse oder über Ihren eigenen customCell-Delegaten tun.

Sie können auch einfach eine Benachrichtigung senden ( [[NSNotificationCenter defaultCenter] postNotification: @"cellButtonTouchedNotification"] ), auf die Ihr viewController hört ( [[NSNotificationCenter defaultCenter] addListener: self target: @selector(...) name: @"cellButtonTouchedNotification"] ). In diesem Fall könnten Sie die Eigenschaft userInfo verwenden, um sich zu merken, welche Zelle berührt wurde.

Eine andere Möglichkeit besteht darin, die Taste von außen zugänglich zu machen (z. B. ein Grundstück). Dann könnten Sie das Ziel in der Methode Ihres tableViewDelegate hinzufügen cellForRowAtIndexPath: . So etwas wie [myCustomCell.button addTarget: self selector: @selector(...)]; Sie können Tags verwenden, um die Zeile zu identifizieren myCustomCell.button.tag = indexPath.row .

5voto

Lorenzo B Punkte 33446

Verwenden Sie die Delegation. Hier ein einfaches Beispiel.

//.h
@protocol MyTableViewCellDelegate;

@interface MyTableViewCell : UITableViewCell

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

//your code here

@end

@protocol MyTableViewCellDelegate <NSObject>

@optional

- (void)delegateForCell:(MyTableViewCell *)cell;

@end

//.m
@implementation MyTableViewCell

@synthesize delegate = _delegate;

- (void)prepareForReuse {
    [super prepareForReuse];

    self.delegate = nil;
}

- (void)buttonAction {

    if ([self.delegate respondsToSelector:@selector(delegateForCell:)])
        [self.delegate delegateForCell:self];
}

@end

Wenn Sie auf die Schaltfläche klicken, senden Sie eine Nachricht an den Delegaten für Ihre Zelle (z. B. den Table View Controller, der in den Navigation Controller eingefügt ist).

Hier der Controller

@implementation YourController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString *reuseIdentifier = @"MyCustomCell";
   MyTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier];

   if (cell == nil)
       cell = [[[MyTableViewCell alloc] initWithMyArgument:someArgument reuseIdentifier:reuseIdentifier] autorelease];

    [cell setDelegate:self];

    // update your cell

    return cell;
}

- (void)delegateForCell:(MyTableViewCell *)cell {

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    // do your stuff

    [self.navigationController pushViewController:...];
}

@end

0voto

MrTJ Punkte 12930

Halten Sie einen Zeiger auf Ihre UITableViewController in der Zelle. Sie können ihn im Konstruktor der Zelle übergeben oder ihn später setzen. Dann können Sie den pushViewController auf dem TableViewController aufrufen.

Eine noch schönere Lösung wäre es, einen Delegaten für Ihre Zelle zu definieren, z.B. ButtonCellDelegate, der einen buttonClicked Callback hat. Sie implementieren den Delegaten in Ihrem UITableViewController (oder an einer anderen Stelle, an der Sie Zugriff auf den View-Controller haben). Dann übergeben Sie den Delegaten wie oben beschrieben an die Zelle und rufen die Callback-Funktion von der Zelle aus auf, wenn die Schaltfläche angeklickt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X