2016-09-15 2 views
0

Ich habe eine tableView mit 2 Abschnitten. Ein Abschnitt hat nur einen row mit dem titleLabel, das Datum anzeigt. Ich verwende Action Sheet Picker, um das Action Sheet anzuzeigen.
Also meiner Ansicht-Controller habe ich ein Objekt von DateTableViewCell *dateCell; erklärt und hier sind meine Delegierten und Datenquelle Methode des Tabellenansicht:Verwenden von UITableViewCell eines Abschnitts zum Auslösen einer IBAction

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 2; 
} 

- (NSString *)tableView:(UITableView *)tableView 
titleForHeaderInSection:(NSInteger)section { 
    if (section == 0) { 
     return @"Date"; 
    } 
    else 
    { 
     return @"Select Location to View Schedule"; 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == 0) { 
     return 1; 
    } 
    else 
    { 
     return 5; 
    } 

} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"locationCell"; 
    HomeLocationTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
          cellIdentifier]; 

    static NSString *dateCellIdentifier = @"dateCell"; 
    dateCell = [tableView dequeueReusableCellWithIdentifier: 
             dateCellIdentifier]; 

    if (cell == nil) { 
     cell = [[HomeLocationTableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:cellIdentifier]; 
    } 
    else if (dateCell == nil) 
    { 
     dateCell = [[DateTableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:dateCellIdentifier]; 
    } 

    if (indexPath.section==0) 
    { 
     dateCell.textLabel.text = [NSString stringWithFormat:@"%@",[NSDate date]]; 
     return dateCell; 
    } 
    else 
    { 
     cell.locationNameLabel.text = @"ABC Hospital"; 
     cell.totalAppointmentLabel.text = @"15 Appointments"; 
     return cell; 
    } 

} 

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section==0) 
    { 
     [dateCell targetForAction:@selector(selectADate:) withSender:self]; 
     //[self performSelector:@selector(selectADate:) withObject:dateCell]; 
    } 
    else 
    { 
     [self.tabBarController setSelectedIndex:1]; 
    } 
} 

Abschnitt Ignorieren 1, da es nur die Demo-Daten ist. Also, das ist, wie ich Datum in die Zelle hinzufügen und wie Sie sehen können, in Zeile für Index Pfad Ich rufe die Methode unten, aber es wird nicht aufgerufen. Ich habe es sowohl mit der kommentierten als auch der nicht kommentierten Zeile versucht.

- (void)selectADate:(UIControl *)sender { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *minimumDateComponents = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; 
    [minimumDateComponents setYear:2000]; 
    NSDate *minDate = [calendar dateFromComponents:minimumDateComponents]; 
    NSDate *maxDate = [NSDate date]; 


    _actionSheetPicker = [[ActionSheetDatePicker alloc] initWithTitle:@"" datePickerMode:UIDatePickerModeDate selectedDate:self.selectedDate 
                   target:self action:@selector(dateWasSelected:element:) origin:sender]; 


    [(ActionSheetDatePicker *) self.actionSheetPicker setMinimumDate:minDate]; 
    [(ActionSheetDatePicker *) self.actionSheetPicker setMaximumDate:maxDate]; 

    [self.actionSheetPicker addCustomButtonWithTitle:@"Today" value:[NSDate date]]; 
    [self.actionSheetPicker addCustomButtonWithTitle:@"Yesterday" value:[[NSDate date] TC_dateByAddingCalendarUnits:NSCalendarUnitDay amount:-1]]; 
    self.actionSheetPicker.hideCancel = YES; 
} 

- (void)dateWasSelected:(NSDate *)selectedDate element:(id)element { 
    self.selectedDate = selectedDate; 

    //may have originated from textField or barButtonItem, use an IBOutlet instead of element 
    dateCell.dateLabel.text = [self.selectedDate description]; 
} 

Wenn ich versuche, - (IBAction)selectADate:(UIControl *)sender statt, was ich jetzt bin mit es mir sagt, es zu etwas zu verbinden, und ich mag es Handy verbinden, aber es gibt keine solche Verbindung möglich, auch wenn ich versuche, es zu implementieren UITableViewCell Klasse.

+0

Warum brauchen Sie Absender? –

+0

Was wäre der Absender in diesem Fall? ist es Zelle? – Lion

+0

@ Mr.UB Ich brauche es nicht. Ich gerade, was didSelect, um Pickerview zu öffnen und geben Sie das dateLabel, was auch immer Benutzer ausgewählt hat. –

Antwort

-1

Erstellen Sie eine IBAction der Schaltfläche in Ihrer benutzerdefinierten Zelle HomeLocationTableViewCell. Implementieren Sie ein Protokoll in Ihrer Zelle und legen Sie den View-Controller (der die Datenquelle und den Delegaten Ihrer Tabellenansicht implementiert) als Delegaten fest.

Wenn die Aktion jetzt ausgelöst wird, senden Sie Ihrem Stellvertreter eine Nachricht, dass die Zelle ein Datum auswählen möchte. Übergeben Sie Ihre Zelle in der Delegat-Nachricht, damit der Delegat seine Datumsbezeichnung bei der Auswahl festlegen kann.

In Ihrem HomeLocationTableViewCell.h @protocol HomeLocationTableViewCellDelegate - (void)homeLocationTableViewCell:(HomeLocationTableViewCell *)cell didTapDateButton; @end und in Ihrem Viewcontroller in cellForRowAtIndexPath cell.delegate = self

Dann Implementieren Sie diese Delegatmethode in Ihrem Viewcontroller

- (void)homeLocationTableViewCell:(HomeLocationTableViewCell *)cell didTapDateButton { //show your action sheet here and use this cell to set its label }

+0

Kein geeigneter Ansatz, da die Zelle kein UIButton benötigt. –

+0

Das ist der ganze Punkt der Anpassung von UITableViewCell. Wie in Apple Docs können Sie Subviews in UITableViewCell hinzufügen. https://developer.apple.com/reference/uikit/uitableviewcell –

0

Sie Ihre Methode etwas machen kann wie,

- (void)selectADate:(UITableViewCell *)cell { 


    // your method body! 
    } 
YorTableViewCellClass *cell = [tableView cellForRowAtIndexPath:indexPath]; 

[self selectADate:cell]; 

aktualisierenund diese Methode von didselectRowAtindexpath wie, rufen:

entfernen Absender von selectADate Methode, so dass es wie sieht

- (void)selectADate{ 

    } 

zweite, was unterhalb der Linie ersetzen,

_actionSheetPicker = [[ActionSheetDatePicker alloc] initWithTitle:@"" datePickerMode:UIDatePickerModeDate selectedDate:self.selectedDate 
                  target:self action:@selector(dateWasSelected:element:) origin:sender]; 

mit

_actionSheetPicker = [[ActionSheetDatePicker alloc] initWithTitle:@"" datePickerMode:UIDatePickerModeDate selectedDate:self.selectedDate 
                  target:self action:@selector(dateWasSelected:element:) origin:self.view]; 

Ich habe self.view statt sender verwendet.

+0

mit dir ändert und meine Methodenimplementierung wie in meiner Frage von 'selectADate' wird der' @selector (dateWasSelected: element:) 'nicht in der init Methode aufgerufen von 'ActionSheetDatePicker' –

+0

okay. Deshalb frage ich zuerst im Kommentar, was wäre der Absender !!! Ich aktualisiere meine Antwort, wenn es funktioniert !! – Lion

+0

Entschuldigung, ich habe dich vermisst kommentieren ... beantworte es hier! Der Sender wäre in diesem Fall vermutlich die Zelle. Aber ich brauche keinen Absender, wenn es einen anderen Weg gibt. Da es nur eine Zelle in diesem Abschnitt gibt und wenn sie ausgewählt wurde, möchte ich die Picker-Ansicht anzeigen. –

Verwandte Themen