【问题标题】:Xamarin IOS UITableViewController RowSelected navigate to UIViewControllerXamarin IOS UITableViewController RowSelected 导航到 UIViewController
【发布时间】:2016-06-10 13:39:26
【问题描述】:

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

公共部分类 CCreateOrderOrderType : UITableViewController { 私有列表 orderTypes; 私有LoadingOverlay loadingOverlay; 公共 CCreateOrderOrderType(IntPtr 句柄):基(句柄) { }

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

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

【问题讨论】:

  • 您的问题中有一些西里尔文字,您可以编辑它以使其更清晰吗? :D
  • @Zil,对不起,我删除了这些符号

标签: c# ios xamarin xamarin.ios


【解决方案1】:

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

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

  1. 获取故事板:UIStoryboard.FromName("main", NSBundle.MainBundle);

这里,“main”是 Storbboard 的名称。检查 .storyboard 文件的文件名。

  1. 使用 .InstantiateViewController ("CCreateOrderC") as CCreateOrderC; 从情节提要中获取控制器,您已经做得很好了。

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

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

由于你没有它,你可以将它作为公共属性传递(即“不是超级干净”的部分)。

只需在类的顶部添加一个公共属性,即public UINavigationController CurrentNavigationController

在哪里创建 tableview 源,只需执行

mySource.CurrentNavigationController = this.navigationcontroller

现在您有了导航,您可以像以前一样在RowSelected 中推送它,

CurrentNavigationController.PushViewController(theVcYouInstantiatedWithTheStoryboard);

编辑前的先前答案

空指针的意思是,“你正在对一个为空的东西执行代码”。

我打赌“parentController”是空的,你不能在空对象上调用代码。仅此一项就可以回答您的问题并帮助您继续发现问题所在:)

好消息是,我很确定你不需要parentController

我建议您将parentController 替换为this

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

这是怎么做的:

在情节提要中,只需使用右键 clic 或 ctrl + clic (origin => destination) 从控制器 A 拖放到控制器 B。然后选择出现的箭头,并给它一个唯一的名称。例如FromAToB,在代码中,从this 调用performSegueWithIdentifier:,并将故事板(FromAToB) 中的segue 名称作为NSString 参数。

就是这样:)

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

如果您仍有问题或需要更多说明,请在下方留言:)

【讨论】:

  • 我发布了我的完整课程
  • 哦哦,你不在控制器中! :P 改变一切
  • 我编辑了我的答案给你一个解决方法。它不是最干净的,但它会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多