我有 UITableViewController。当用户单击单元格时,我需要打开另一个 ViewController。这是我的代码:
公共(public)部分类 CCreateOrderOrderType : UITableViewController { 私有(private)列表 orderTypes; 私有(private)LoadingOverlay loadingOverlay; 公共(public) 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);
}
}
但我在第一行有空指针异常。怎么了?
编辑:我不知道你在源类中的哪个位置,而不是在 Controller 中。
解决此问题的简单步骤。不是 super 干净,但现在可以解决问题:
UIStoryboard.FromName("main", NSBundle.MainBundle);
这里,“main”是 Storbboard 的名称。检查 .storyboard 文件的文件名。
从 Storyboard 中获取 Controller ,使用 .InstantiateViewController ("CCreateOrderC") as CCreateOrderC;
你已经做得很好了。
确保它不为空,你也很好。
将该 Controller 推到当前导航 Controller 上。
由于你没有它,你可以将它作为公共(public)属性传递(即“不是 super 干净”的部分)。
只需在你的类顶部添加一个公共(public)属性,即public UINavigationController CurrentNavigationController
,
在哪里创建 tableview 源,只需执行
mySource.CurrentNavigationController = this.navigationcontroller
现在你有了导航,你可以像以前一样在 RowSelected
中推送它,
CurrentNavigationController.PushViewController(theVcYouInstantiatedWithTheStoryboard);
空指针的意思是,“你正在对一个为空的东西执行代码”。
我打赌“parentController”是空的,你不能在空对象上调用代码。仅此一项就可以回答您的问题并帮助您继续发现问题所在
好消息是,我很确定你不需要那个 parentController
。
我建议你将 parentController
替换为 this
。
此外,如果您使用 Storyboard,您可以使用几乎为零代码的 segue
(您可以删除所有行!)。
这是怎么做的:
在 Storyboard 中,只需使用右键 clic 或 ctrl + clic (origin => destination) 从 Controller A 拖放到 Controller B。然后选择出现的箭头,并给它一个唯一的名称。例如 FromAToB
和在代码中,从 this
调用 performSegueWithIdentifier:
,并给它 Storyboard中的 segue 名称(FromAToB
) 作为 NSString 参数。
就是这样
如果您需要传递一些数据,您可以在 Controller 中覆盖 prepareForSegue
,但这是另一个主题。
如果您仍有问题或需要更多说明,请在下方留言
关于c# - Xamarin IOS UITableViewController RowSelected 导航到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37749776/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |