在tableview Xamarin.IOS中选择行后更新文本字段

时间:2016-08-01 15:12:29

标签: uitableview xamarin xamarin.ios uipopovercontroller

这是我遇到的情景。我正在使用UserName作为其中一个字段的登录屏幕。用户可以使用下拉列表选择用户(通过按钮实现 - 模拟下拉箭头,弹出控制器和表格视图)。我有一个控制器(UserNameController),它具有获取用户名并将其绑定到其中的表视图的逻辑。 UserNameController通过ViewController.cs调用,它具有textfield和下拉按钮,使用下面的代码:

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);

并在UserNameController中:

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

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

和TabelSource.cs看起来像这样:

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);
        }
    }

现在我如何在viewcontroller的文本字段中显示所选用户名并关闭弹出窗口?

谢谢! SID

1 个答案:

答案 0 :(得分:0)

我通常使用TableViewSource和TableViewController上的属性来解决此要求。您的来源将更改为:

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);
    }
}

现在你需要一种方法来获得这个价值。有两种可能的方式:

1)UserNameController的类型为UITableViewController,而不是(content.TableView.Source as TableSource).SelectedItem

2)UserNameController的类型不是UITableViewController,而是我还要添加一个返回TableViewSource属性的属性。

最后要做的是关闭Popover并查询所选项目。对于这个任务,我将UserNameController包装在UINavigationController中,并像这样添加一个Cancel和Done按钮:

 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);