我有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指针异常。怎么了?
答案 0 :(得分:2)
编辑:我不知道你在源类中的位置,而不是控制器。
解决此问题的简单步骤。不是很干净,但现在可以解决这个问题:
UIStoryboard.FromName("main", NSBundle.MainBundle);
这里,“main”是storbyoard的名称。检查.storyboard文件的文件名。
使用您已经做得很好的.InstantiateViewController ("CCreateOrderC") as CCreateOrderC;
从该故事板中获取控制器。
确保它不为空,你也做得很好。
将控制器推到当前导航控制器上。
由于你没有在这里,你可以将它作为公共财产(即“非超级干净”部分)传递。
只需在班级上添加公共媒体资源,即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
,但这是另一个主题。
如果您仍有问题或需要在某处进行更多说明,请在下面发表评论:)