Xamarin IOS UITableViewController RowSelected导航到UIViewController

时间:2016-06-10 13:39:27

标签: c# ios xamarin xamarin.ios

我有UITableViewController。当用户点击单元格时,我需要打开另一个ViewController。这是我的代码:

public partial class CCreateOrderOrderType:UITableViewController     {         private List orderTypes;         private LoadingOverlay loadingOverlay;         public CCreateOrderOrderType(IntPtr handle):base(handle)         {         }

    public CCreateOrderOrderType (List<OrderType> orderTypes){
        this.orderTypes = orderTypes;
    }

    public override void ViewDidLoad(){
        TableView.Source = new OrderTypeTableSource (this, orderTypes);
    }
}

public class OrderTypeTableSource : UITableViewSource {

    private CCreateOrderOrderType owner;
    private List<OrderType> orderTypes;
    private string cellIdentifier = "orderGroupCI";

    public OrderTypeTableSource(CCreateOrderOrderType owner, List<OrderType> orderTypes){
        this.owner = owner;
        this.orderTypes = orderTypes;
    }

    public override nint RowsInSection (UITableView tableview, nint section){
        return orderTypes.Count;
    }

    public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
        OrderType item = orderTypes[indexPath.Row];
        if (cell == null)
        { 
            cell = new UITableViewCell (UITableViewCellStyle.Subtitle, cellIdentifier);
            cell.DetailTextLabel.Text = item.orderTypeName;
            cell.Accessory = UITableViewCellAccessory.DisclosureIndicator; 
        }
        return cell;
    }

    public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
    {
        CCreateOrderC clientOrderCreate = owner.Storyboard.InstantiateViewController ("CCreateOrderC") as CCreateOrderC;
        clientOrderCreate.selectedOrderType = orderTypes [indexPath.Row];
        if (clientOrderCreate != null) {
            owner.NavigationController.PushViewController (clientOrderCreate, true);
        }
        tableView.DeselectRow (indexPath, true);
    }
}

但是我在第一行有Null指针异常。怎么了?

1 个答案:

答案 0 :(得分:2)

编辑:我不知道你在源类中的位置,而不是控制器。

解决此问题的简单步骤。不是很干净,但现在可以解决这个问题:

  1. 获取故事板:UIStoryboard.FromName("main", NSBundle.MainBundle);
  2. 这里,“main”是storbyoard的名称。检查.storyboard文件的文件名。

    1. 使用您已经做得很好的.InstantiateViewController ("CCreateOrderC") as CCreateOrderC;从该故事板中获取控制器。

    2. 确保它不为空,你也做得很好。

    3. 将控制器推到当前导航控制器上。

    4. 由于你没有在这里,你可以将它作为公共财产(即“非超级干净”部分)传递。

      只需在班级上添加公共媒体资源,即public UINavigationController CurrentNavigationController

      以及创建该tableview源的地方,只需执行

      mySource.CurrentNavigationController = this.navigationcontroller

      现在您已经拥有了导航功能,您可以像RowSelected一样推送它,

      CurrentNavigationController.PushViewController(theVcYouInstantiatedWithTheStoryboard);

      在编辑之前的先前的答案

      空指针所说的是“你正在执行无效的代码”。

      我打赌“parentController”为null,你不能在null对象上调用代码。只有这一点应该回答你的问题并帮助你继续发现出了什么问题:)

      好的是,我很确定你无论如何都不需要parentController

      我建议您将parentController替换为this

      另外,如果您使用的是故事板,则可以使用segue几乎为零的代码(您可以删除所有行!)。

      以下是如何操作:

      在故事板中,只需拖放即可。使用右clic或ctrl + clic(origin =&gt; destination)从控制器A掉落到控制器B.然后选择出现的箭头,并为其指定唯一名称。例如FromAToB,在代码中,从performSegueWithIdentifier:调用this,并将其作为NSString参数从storyboard(FromAToB)中提供segue名称。

      就是这样:))

      如果您需要传递一些数据,可以覆盖控制器中的prepareForSegue,但这是另一个主题。

      如果您仍有问题或需要在某处进行更多说明,请在下面发表评论:)