2016-08-01 6 views
0

Hier ist ein Szenario, dem ich begegne. Ich habe einen Login-Bildschirm mit UserName als eines der Felder. Der Benutzer kann einen Benutzer mit einer Dropdown-Liste auswählen (implementiert über eine Schaltfläche - um den Dropdown-Pfeil zu simulieren, einen Popover-Controller und eine Tabellenansicht). Ich habe einen Controller (UserNameController), der die Logik hat, die Benutzernamen abzurufen und sie an die darin enthaltene Tabellenansicht zu binden. Die UserNameController wird über ViewController.cs genannt, die das Textfeld und auf den Dropdown-Button Code hat:Textfeld aktualisieren, nachdem eine Zeile in der Tabellenansicht ausgewählt wurde Xamarin.IOS

var content = this.Storyboard.InstantiateViewController("UserNameLookUp") as UserNameController; 
      UIPopoverController popover = new UIPopoverController(content); 

      //popover.SetPopoverContentSize(new SizeF(80, 80), true); 

      popover.PresentFromRect(new RectangleF(float.Parse((sender.Frame.X + 115).ToString()), 
                float.Parse((sender.Frame.Y + 180).ToString()) 
                , 80, 80), View, UIPopoverArrowDirection.Up, true); 

und in UserNameController:

public override void ViewDidLoad() 
     { 
      string[] userName = new string[10]; 

       tblVwUserName.Source = new TableSource(userName); 
      } 
     } 

und TabelSource.cs sieht wie folgt aus:

public class TableSource : UITableViewSource 
    { 
     string[] TableItems; 
     string CellIdentifier = "TableCell"; 

     public TableSource(string[] items) 
     { 
      TableItems = items; 
     } 

     public override nint RowsInSection(UITableView tableview, nint section) 
     { 
      return TableItems.Length; 
     } 

     public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
     { 
      UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier); 
      string item = TableItems[indexPath.Row]; 

      //---- if there are no cells to reuse, create a new one 
      if (cell == null) 
      { cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier); } 

      cell.TextLabel.Text = item; 

      return cell; 
     } 

     public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
     { 
      // HOW TO SET BACK THE USERNAME TEXT FIELD IN VIEWCONTROLLER? AND CLOSE THE POPUP 
      tableView.DeselectRow(indexPath, true); 
     } 
    } 

Nun, wie muss ich den ausgewählten Benutzernamen im Textfeld des Viewcontrollers anzeigen und das Popup schließen?

Danke! Sid

Antwort

0

Ich löse normalerweise diese Anforderung mit Eigenschaften auf der TableViewSource und dem TableViewController. Ihre Quelle ändert sich in:

public class TableSource : UITableViewSource 
{ 
    string[] TableItems; 
    string CellIdentifier = "TableCell"; 

    public string SelectedItem {get; set;} 

    public TableSource(string[] items) 
    { 
     TableItems = items; 
    } 

    public override nint RowsInSection(UITableView tableview, nint section) 
    { 
     return TableItems.Length; 
    } 

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
    { 
     UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier); 
     string item = TableItems[indexPath.Row]; 

     //---- if there are no cells to reuse, create a new one 
     if (cell == null) 
     { cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier); } 

     cell.TextLabel.Text = item; 

     return cell; 
    } 

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
    { 
     SelectedItem = items[indexPath.Row];    

     tableView.DeselectRow(indexPath, true); 
    } 
} 

Jetzt brauchen Sie einen Weg, um diesen Wert zu erhalten. Es gibt zwei Möglichkeiten:

1) UserNameController ist vom Typ UITableViewController, als es (content.TableView.Source as TableSource).SelectedItem

2) UserNameController wäre, ist nicht vom Typ UITableViewController, als auch ich eine Eigenschaft hinzufügen würde, dass die Eigenschaft des TableViewSource zurück .

Zuletzt müssen Sie das Popover schließen und das ausgewählte Objekt abfragen. Für diese Aufgabe würde ich den UserNameController in einen UINavigationController verpacken und eine Abbrechen- und eine Erledigt-Taste dazu wie folgt hinzufügen:

var navigationController = new UINavigationController(content); 
var popover = new UIPopoverController(navigationController); 

content.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem(UIBarButtonSystemItem.Cancel, (s, e) => 
{ 
    parentController.DismissViewController(true, null); 
}), true); 
content.NavigationItem.SetRightBarButtonItem(new UIBarButtonItem(UIBarButtonSystemItem.Done, (s, e) => 
{ 
    parentController.DismissViewController(true, null); 

    var selectedItem = (content.Source as TableSource).SelectedItem; 
    }), true); 
Verwandte Themen