2016-10-15 79 views
0

我想从我的第一个视图即表视图控制器打开新的视图控制器。如何从UITableViewRow按钮点击事件打开新视图?

This is View from Simulator.

第一个视图控制器:控制器的TableView与行。 第二视图控制器:第一个表视图控制器上选定行的TableView控制器,详细视图控制器。

using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using Foundation; 
    using UIKit; 

    namespace TourStops.iOS { 

     class TourStopsTableSource : UITableViewSource { 
      private List<TourLib.TourStop> _stops; 
      NSString _cellID = new NSString("TableCell"); 
FirstViewController _fvc; 
      public TourStopsTableSource(FirstViewController fvc) { 
       _stops = TourLib.TourSource.GetAllTourStops(); 
_fvc = fvc; 
      } 

      public override nint RowsInSection(UITableView tableview, nint section) 
      { 
       // tell the TableView how many rows to create 
       return _stops.Count; 
      } 
      public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) { 
       TourLib.TourStop currentTourStop = _stops[indexPath.Row]; 

       var cell = tableView.DequeueReusableCell(_cellID) as TourStopTableCell; 
       if (cell == null) { cell = new TourStopTableCell(_cellID); } 


       cell.UpdateCellControlsWithTourData(currentTourStop.Name, currentTourStop.Phone); 

       #region SetupMapButton 
       string mapUrl = String.Format("http://maps.google.com/maps?q={0}+{1}", 
                        currentTourStop.Latitude, 
                        currentTourStop.Longitude); 
       cell.MapButton.TouchUpInside += delegate (object sender, EventArgs e) 
       { 
        UIApplication.SharedApplication.OpenUrl(new NSUrl(mapUrl)); 
       }; 
       #endregion 
       cell.CallButton.TouchUpInside += OpenDetailView; 

       return cell; 
      } 

      private void OpenDetailView(object sender, EventArgs e) { 
       var view = new SecondDetailController(); 
    _parent.NavigationController.PushViewController(view, true); 
      } 

     } 
    } 

我FirstViewController类:

using Foundation; 
using System; 
using UIKit; 

namespace TourStops.iOS 
{ 
    public partial class FirstViewController : UIViewController 
    { 
     public FirstViewController (IntPtr handle) : base (handle) 
     { 
     } 

     public FirstViewController() 
     { 
     } 

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

      TourStopsTable.Source = new TourStopsTableSource(new FirstViewController()); 
     } 
    } 
} 

Exception after following the steps of Jason.

回答

1

您需要的NavigationController参考。有多种方法可以做到这一点,但一个共同的行话是,当你创建你的源代码,传递一个引用到它的父VC

ViewController _parent; 

public TourStopsTableSource(UIViewController parent) { 
    _stops = TourLib.TourSource.GetAllTourStops(); 
    _parent = parent; 
} 

那么,假设你的父母VC包含在NavigationController内,

private void OpenDetailView(object sender, EventArgs e) { 
    var view = new SomeDetailController(); 
    _parent.NavigationController.PushViewController(view, true); 
} 

编辑:

在你上面的修改例子,你正在做

TourStopsTable.Source = new TourStopsTableSource(new FirstViewController()); 

而不是你需要传递一个参考到已有的VC:

TourStopsTable.Source = new TourStopsTableSource(this); 
+0

感谢您的帮助。 – Khaksar

+0

但这并没有为我工作。 我做到了,你说的方法相同,但它给了异常,异常的详细信息如下: System.NullReferenceException:在Navigation.Application.Main(系统未将对象引用设置到对象 的一个实例。 String []参数)[0x00008]在/Users/Admin/Projects/TourStops/TourStops/Main.cs: 我更新我的问题,你告诉我的步骤。 谢谢, – Khaksar

+0

如果您有任何问题,请您提供一个可用的示例! – Khaksar