如何在RowSelected事件上导航到Xamarin iOS中的ViewController

时间:2013-10-18 06:48:13

标签: ios uinavigationcontroller xamarin.ios mkmapview xamarin

我在主屏幕上有一个TableView,它位于导航控制器内。现在,当选择一行时,我想显示一个MapView。

我希望能够访问导航控制器并将MapViewController推入其中。我怎样才能实现这一目标?

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{

}

2 个答案:

答案 0 :(得分:9)

我认为您的RowSelected方法位于UITableViewController,对吗?在这种情况下,您可以轻松访问NavigationController属性(在UIViewcontroller中定义),该属性会自动设置为父UINavigationController

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
    var index = indexPath.Row;
    NavigationController.PushViewController (new MyDetailViewController(index));
}

现在,您可能应该使用UITableViewSource,并在那里覆盖RowSelected。在这种情况下,请确保通过构造函数注入使UINavigationController可用:

tableViewController = new UITableViewController();
tableViewController.TableView.Source = new MyTableViewSource (this);

class MyTableViewSource : UITableViewSource
{
    UIViewController parentController;
    public MyTableViewSource (UIViewController parentController) 
    {
        this.parentController = parentController;
    }

    public override int RowsInSection (UITableView tableview, int section)
    {
        //...
    }

    public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        //...
    }

    public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
    {
        var index = indexPath.Row;
        parentController.NavigationController.PushViewController (new MyDetailViewController(index));
    }
}

使用MyDetailViewController替换此通用答案中的MapViewController,您应该全部设置。

答案 1 :(得分:1)

我想从IndexViewController导航到ViewController。我使用以下代码。

IndexViewController owner;

    public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
            {
                UIStoryboard board = UIStoryboard.FromName ("Main", null);
                ViewController ctrl = (ViewController)board.InstantiateViewController ("viewControllerID");
                owner.NavigationController.PushViewController (ctrl, true);
        }