ilight
ilight

Reputation: 1622

How to navigate to ViewController in Xamarin iOS on RowSelected event

I am having a TableView on my home screen which is inside a Navigation Controller. Now, when a row is selected, I want to show a MapView.

I want to get access to the Navigation Controller and push a MapViewController into it. How can i achieve this?

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

}

Upvotes: 3

Views: 13454

Answers (2)

Alvin George
Alvin George

Reputation: 14296

I wanted to navigate from IndexViewController To ViewController. I use the following code.

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

Upvotes: 1

Stephane Delcroix
Stephane Delcroix

Reputation: 16232

I assume your RowSelected method is in your UITableViewController, right? In this case, it's easy, as you can access the NavigationController property (defined in UIViewcontroller) which is automatically set to the parent UINavigationController

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

Now, you probably should use a UITableViewSource, and override RowSelected there. In that case, make sure the UINavigationController is available by doing constructor injection:

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

Replace MyDetailViewController in this generic answer by your MapViewController and you should be all set.

Upvotes: 10

Related Questions