2016-08-15 5 views
2

Meine TableView-Zelle hat eine Schaltfläche. Beim Klicken möchte ich die Zelle erweitern. Zum Vergrößern ändere ich die Höhe der Zelle beim Klicken auf die Schaltfläche und lade die Zeile neu. Aber wenn eine Zeile erweitert wird und ich versuche, eine andere Zeile zu erweitern, ist das Verhalten nicht wie erwartet. Die zuvor erweiterte Zeile schließt statt der angeklickten Zeile.ios: UITableViewCell Erweitern funktioniert nicht wie erwartet

Auch manchmal muss ich zweimal auf die Schaltfläche klicken, um zu erweitern.

public class ProgramMeasurementDetailsTableViewSource : UITableViewSource 
{ 

    List<ProgramMeasurementDetail> mList; 

    string HeaderIdentfier = "programMeasurementDetailsHeader"; 
    string CellIdentifier = "programMeasurementDetailsCell"; 
    int TAG_CHECKBOX = 61; 
    int TAG_LABEL_VITAL_NAME = 62; 
    int TAG_LABEL_GOAL = 63; 
    int TAG_BUTTON_EDIT = 64; 
    int TAG_VIEW_HEADER_COLUMN_SEPARATOR = 66; 
    int TAG_VIEW_ROW_COLUMN_SEPARATOR = 65; 
    List<bool> expandStatusList = new List<bool>(); 
    UITableView tableView; 

    public ProgramMeasurementDetailsTableViewSource(List<ProgramMeasurementDetail> mList, UITableView tableView) 
    { 
     this.tableView = tableView; 
     this.mList = mList; 
     for (int i = 0; i < mList.Count; i++) 
      expandStatusList.Add(false); 
    } 

    public override nint NumberOfSections(UITableView tableView) 
    { 
     return 1; 
    } 

    public override nint RowsInSection(UITableView tableview, nint section) 
    { 
     return mList.Count; 
    } 

    public override nfloat GetHeightForHeader(UITableView tableView, nint section) 
    { 
     return 32; 
    } 

    public override nfloat GetHeightForRow(UITableView tableView, Foundation.NSIndexPath indexPath) 
    { 
     if (expandStatusList[indexPath.Row]) 
      return 70; 
     else 
      return 32; 
    } 

    public override UITableViewCell GetCell(UITableView tableView, Foundation.NSIndexPath indexPath) 
    { 
     UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier); 
     if (cell == null) 
     { 
      cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier); 
     } 
     CheckBox checkBox = (CheckBox)cell.ViewWithTag(TAG_CHECKBOX); 
     UILabel vitalNameLabel = (UILabel)cell.ViewWithTag(TAG_LABEL_VITAL_NAME); 
     UILabel goalLabel = (UILabel)cell.ViewWithTag(TAG_LABEL_GOAL); 
     UIButton editGoalButton = (UIButton)cell.ViewWithTag(TAG_BUTTON_EDIT); 
     editGoalButton.TouchUpInside += (object sender, EventArgs e) => 
     { 
      expandStatusList[indexPath.Row] = !expandStatusList[indexPath.Row]; 
      tableView.ReloadRows(new Foundation.NSIndexPath[] { indexPath }, UITableViewRowAnimation.Automatic); 

     }; 

     ..... 
     return cell; 
    } 
} 

Ich habe versucht, auf die Schaltfläche Click-Ereignis innerhalb des if (Zelle == null) Handhabung bewegt, dann aber Taste klicken/expandieren haupt nicht funktioniert. Ich habe einen Haltepunkt gesetzt und es scheint, dass dieser Teil nie ausgeführt wird.

Ich habe das Zellenlayout in Storyboard entwickelt.

Ich habe seit einiger Zeit mit diesem Problem zu kämpfen. Jede Hilfe wird geschätzt.

Antwort

2

Wird der Fehler angezeigt, wenn Sie die Liste nach oben oder unten scrollen? Dies geschieht, weil Sie den TouchUpInside Event-Handler in der GetCell-Methode verdrahten und dann nicht losgeholt werden, wenn die Zelle wiederverwendet wird, so dass Sie mehrere Zellen mit demselben Handler oder sogar mehreren Handlern verdrahtet haben!

Im Allgemeinen möchten Sie diese Arten von Dingen in der GetCell Methode nicht tun, es sollte nur verwendet werden, DequeueReusableCell oder erstellen Sie eine neue. Alles andere sollte innerhalb einer benutzerdefinierten Zelle erfolgen.

an Ihrem Codebeispiel sucht, ist es nicht so aussehen wie Sie eine benutzerdefinierte Zelle verwenden, so was Sie tun können, ist dies:

1.) In GetCell stellen Sie den Tag der Taste als Reihe die indexPath

editGoalButton.Tag = indexPath.Row; 

2.) In ProgramMeasurementDetailsTableViewSource erstellen Sie eine separate Methode für Ihre Event-Handler:

private void ToggleRow(object sender, EventArgs e) 
{ 
    var btn = sender as UIButton; 
    expandStatusList[btn.Tag] = !expandStatusList[btn.Tag]; 
    tableView.ReloadRows(new Foundation.NSIndexPath[] { NSIndexPath.FromRowSection(btn.Tag, 0) }, UITableViewRowAnimation.Automatic); 
} 

3.) In GetCell Un Haken, bevor Sie den TouchUpInside Handler rehook:

editGoalButton.TouchUpInside -= ToggleRow; 
editGoalButton.TouchUpInside += ToggleRow; 

Während diese dafür sorgen, dass die Taste nur einmal angeschlossen ist, es ist wirklich nicht der richtige Weg, um eine Situation wie diese zu behandeln. Sie sollten eine benutzerdefinierte Zelle verwenden und die gesamte Verkabelung in der Zelle vornehmen und dann die PrepareForReuse Übersteuerung in UITableViewCell aushängen und aufräumen. Ich würde allerdings diese gehen Xamarin tutorial

sehr empfehlen, wenn Sie durch sie gehen Sie ... merken, wie konsolidiert die GetCell Methode.

--UPDATE-- In Ihrem CustomCell Klasse:

private EventHandler _tapAction; 
public void Setup(EventHandler tapAction, int row, ....) 
{ 
    //keep a reference to the action, so we can unhook it later 
    _tapAction = tapAction; 
    editGoalButton.Tag = row; 
    .... 
    editGoalButton.TouchUpInside += _tapAction; 
} 

public override void PrepareForReuse() 
{ 
    .... 
    editGoalButton.TouchUpInside -= _tapAction; 
    _tapAction = null; 
} 

Und Sie würden nur durch die ToggleRow Methode als Action-Parameter übergeben, wenn Sie Setup in GetCell nennen.

+0

Also sollte ich kein Storyboard zum Entwerfen von Zellen verwenden? Jetzt habe ich die Zelle im Storyboard entworfen. Ist es möglich, es als das Design der Zelle in der Klasse CustomCell zu verwenden? – HeisenBerg

+0

Sie können auch eine Zelle aus dem Storyboard verwenden. Stellen Sie nur sicher, dass "TableView Cell Style" auf "Custom" eingestellt ist und geben Sie ihm einen Klassennamen. Xamarin erzeugt '.cs' Dateien für die benutzerdefinierte Klasse. Der Anfangsteil dieses Tutorials zeigt Ihnen, wie Sie den Code hinter der Datei generieren: https://developer.xamarin.com/guides/ios/user_interface/tables/autosizing-row-height/ – pnavk

+0

Wo definiere ich die Schaltfläche TouchUpinside wann benutzerdefinierte Zellenklasse verwenden? Setze ich die benutzerdefinierte Zellenklasse ein. Wenn ja, wie lade ich die Tabellenansichtszeile von dort neu? – HeisenBerg

Verwandte Themen