2017-03-09 5 views
0

Im Bild unten sind die UISwitches unten in einer Sammelansicht untergebracht. Ich stehe jedoch derzeit vor einem Problem, wo. Wenn ich oben einen Schalter zB in Roof Structure anwähle, wähle ich den Schalter NON-SABS APPROVED PRODUCT, wenn ich einen anderen Schalter herunterscrolle, für den nicht in der Ansicht ausgewählt wurde.UICollectionview Klick Ereignis für UISwitch

Ich habe die folgenden Schritte ausgeführt, um festzustellen, wie Man-Click-Ereignisse ausgelöst werden. Ich habe die Konsole verwendet, um die Ausgabe zu sehen, wenn ein Schalter ausgewählt ist. Die Ergebnisse zeigten, dass in einigen Fällen der Schalter Switch Switch nur als drittes Ereignis ausgelöst wird und die anderen zwei Ereignisse, die ausgelöst werden, Schalter sind, die sich nicht in der Benutzeransicht befinden.

Um dieses Problem zu lösen, habe ich versucht, das Problem zu lösen, indem ich dem Switch ein negatives Klickereignis zuwies. Diese bisher nicht funktioniert hat, sehen Sie den Code unten

Der Code für den Schalter Ereignis

public void btnQuestionAnswer_Click(object sender, EventArgs e) 
      { 
       UITableViewRowSwitch btnQuestionAnswer = (UITableViewRowSwitch)sender; 


        if ((btnQuestionAnswer.section.HasValue) && (btnQuestionAnswer.row.HasValue)) 
        { 

         db_QuestionAnswer questionAnswer = questionDataModel[btnQuestionAnswer.section.Value].QuestionAnswers[btnQuestionAnswer.row.Value]; 

         //Console.Write(questionAnswer.Answer); 
         Console.WriteLine(questionAnswer.Answer); 

         if ((btnQuestionAnswer.On)) 
         { 
          if (questionDataModel[btnQuestionAnswer.section.Value].ComplianceIndicator) 
          { 
           foreach (db_QuestionAnswer QA in questionDataModel[btnQuestionAnswer.section.Value].QuestionAnswers) 
           { 
            QA.isTicked = false; 
           } 
          } 
          questionAnswer.isTicked = true; 
          // ((UICollectionView)btnQuestionAnswer.relatedView).ReloadData(); 
         } 
         else 
         { 
          questionAnswer.isTicked = false; 
         } 
        } 

        else 
        { 
         btnQuestionAnswer.On = !btnQuestionAnswer.On; 
        } 
        var element = count.ToString(); 

      } 

public override UICollectionViewCell GetCell (UICollectionView Collection, NSIndexPath indexPath) { UIView Zelle;

   if (questionDataModel[indexPath.Section].ComplianceIndicator) 
       { 
        cell = collectionView.DequeueReusableCell (QuestionUICollectionViewDelegateDataSource.complianceQuestionCellId, indexPath); 
       } 
       else 
       { 
        cell = collectionView.DequeueReusableCell (QuestionUICollectionViewDelegateDataSource.questionCellId, indexPath); 
       } 

       int row = indexPath.Row; 

       UILabel lblQuestionAnswer = (UILabel)cell.ViewWithTag (1); 
       UITableViewRowSwitch btnQuestionAnswer = (UITableViewRowSwitch)cell.ViewWithTag (2); 



       btnQuestionAnswer.ValueChanged -= btnQuestionAnswer_Click; 

       btnQuestionAnswer.ValueChanged -= btnQuestionAnswer_Click; 

       btnQuestionAnswer.ValueChanged += btnQuestionAnswer_Click; 
       if (row < questionDataModel [indexPath.Section].QuestionAnswers.Count) 
       { 
        lblQuestionAnswer.Text = questionDataModel[indexPath.Section].QuestionAnswers[indexPath.Row].Answer; 

        btnQuestionAnswer.section = indexPath.Section; 
        btnQuestionAnswer.row = indexPath.Row; 


        btnQuestionAnswer.On = questionDataModel [indexPath.Section].QuestionAnswers [indexPath.Row].isTicked; 

        //----------------TODO----------------// 
        // ---- 
        btnQuestionAnswer.ValueChanged += btnQuestionAnswer_Click; 

        btnQuestionAnswer.ValueChanged -= btnQuestionAnswer_Click; 
        //if (!btnQuestionAnswer.hasEvent) 
        { 
         btnQuestionAnswer.ValueChanged -= btnQuestionAnswer_Click; 
         //btnQuestionAnswer.ValueChanged -= btnQuestionAnswer_Click; 
         btnQuestionAnswer.ValueChanged += btnQuestionAnswer_Click; 

         //btnQuestionAnswer.hasEvent = true; 
        } 

        btnQuestionAnswer.relatedView = collectionView; 
        if (questionDataModel [indexPath.Section].isLocked) 
        { 
         btnQuestionAnswer.Enabled = false; 
        } 
        else 
        { 
         btnQuestionAnswer.Enabled = true; 
        } 

        lblQuestionAnswer.Hidden = false; 
        btnQuestionAnswer.Hidden = false; 
       } 
       else 
       { 
        lblQuestionAnswer.Hidden = true; 
        btnQuestionAnswer.Hidden = true; 
       } 

       if (controller.loggedInUser.UserType != "Inspector") 
       { 
        btnQuestionAnswer.Enabled = false; 
       } 

       return (UICollectionViewCell)cell; 
      } 

enter image description here

Antwort

1

würden Sie am ehesten die folgenden Methoden der UICollectionViewCell außer Kraft setzen müssen:

public override void PrepareForReuse() 
    { 
     base.PrepareForReuse(); 
    } 

    public override void AwakeFromNib() 
    { 
     base.AwakeFromNib(); 

    } 

Das Problem, das Sie sehen, ist, dass die Sammlung Ansicht richtig ist ‚Wiederverwendung‘ Zelle Diese wurden bereits in den Speicher geladen und behalten somit den aktuellen 'Status' der Steuerelemente, die sich in den Zellen UIView befinden. In der Vorbereitung für die Wiederverwendung müssen Sie also alle UIS-Schalter auf ihre Standardwerte zurücksetzen. Sie können dann die 'AwakeFromNib'-Überschreibung verwenden, um sicherzustellen, dass die Zellen, die den Status ihrer Switches beibehalten sollen, entsprechend eingestellt sind. Sie wären wahrscheinlich klug, einige Bool-Werte innerhalb der UIcollectionViewCell zu haben, die den aktuellen Zustand der Schalter beibehalten und sie dann in 'AwakeFromNib' anwenden. Hoffe das hilft.

Edit:

Wie Sie verwenden statische Zellen im Moment erscheint, hier ist ein Link zu xamarins Dokumentation auf Ihre eigenen Zellen von der Basis UICollectionViewCell abzuleiten. Link

Dies sollten Sie die Informationen, die Sie die Klasse ableiten müssen und geben Sie die Methoden greifen ich oben erwähnt, Sie viel mehr Kontrolle über ermöglicht, was angezeigt wird, und in welchem ​​Zustand usw.

+0

Wie kann ich PrepareForReuse Ich erhalte den folgenden Fehler Kein passender Fehler zum Ändern gefunden – George

+0

Verwenden Sie eine benutzerdefinierte Klasse für Ihre Zellen? oder verwenden Sie statische Zellen? z. öffentliche partielle Klasse MyDerivedCell: UICollectionViewCell – Digitalsa1nt

+0

Klasse meilensteinViewDelegateDataSource: UITableViewSource {} und Klasse QuestionUICollectionViewDelegateDataSource: UICollectionViewSource {} – George

Verwandte Themen