Xamarin iOS中UITextField赋值无显示且空指针异常问题求助
解决Xamarin.iOS Storyboard Outlet赋值无显示/空指针问题
嘿,我来帮你梳理清楚这个问题的核心,以及怎么解决它!
问题根源
你现在的代码犯了一个很典型的新手错误:你在dateValueChanged里新建了一个完全独立的NewPmSheetViewController实例,这个实例和你通过PerformSegue("dateSegue", this)跳转到的那个ViewController根本不是同一个对象!
- 当你通过Segue跳转时,系统会从Storyboard中实例化对应的ViewController,并且自动完成所有Outlet(比如你的
dateInput)和界面控件的绑定。 - 但你手动
new出来的NewPmSheetViewController,完全没有和Storyboard的界面关联,它的dateInput要么是null(触发空指针异常),要么你手动new UITextField()创建的是一个全新的、不在界面上的文本框,所以赋值后自然看不到效果。
正确的解决方案:通过Segue传递数据
我们需要用Xamarin.iOS标准的Segue数据传递方式,而不是手动创建实例:
1. 给目标ViewController添加数据接收属性
在NewPmSheetViewController里加一个属性,用来接收传递过来的日期字符串:
public string SelectedDate { get; set; }
2. 重写PrepareForSegue传递数据
在发起Segue的那个ViewController里,重写PrepareForSegue方法,把选中的日期传递给目标VC:
// 先在类里存一下选中的日期 private string _selectedDate; public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) { base.PrepareForSegue(segue, sender); // 确认是我们的dateSegue if (segue.Identifier == "dateSegue") { var targetVC = segue.DestinationViewController as NewPmSheetViewController; if (targetVC != null) { // 把之前存的日期传过去 targetVC.SelectedDate = _selectedDate; } } }
3. 在目标VC的生命周期方法中赋值给Outlet
在NewPmSheetViewController的ViewWillAppear方法里,把接收的日期赋值给dateInput(这个方法会在界面即将显示时调用,确保Outlet已经绑定完成):
public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); if (!string.IsNullOrEmpty(SelectedDate)) { dateInput.Text = SelectedDate; } }
4. 修改dateValueChanged方法
现在不需要手动创建VC实例了,只需要存储选中的日期即可:
partial void dateValueChanged(UIDatePicker sender) { var date = PMSimpilfied.Application.NSDateToDateTime(datePicker.Date); _selectedDate = date.ToString("dd-MM-yyyy"); // 如果是在日期选择后需要更新已经显示的目标VC,可以通过导航栈获取: // var targetVC = NavigationController.TopViewController as NewPmSheetViewController; // if (targetVC != null) // { // targetVC.dateInput.Text = _selectedDate; // } }
额外提醒:别手动创建Storyboard绑定的VC实例
以后记住,凡是通过Storyboard创建的ViewController,不要用new关键字手动实例化,否则它的所有Outlet都不会和界面控件绑定,只会导致空指针或者无效赋值的问题。正确的方式要么用Segue,要么用UIStoryboard.InstantiateViewController方法从Storyboard加载。
内容的提问来源于stack exchange,提问作者Jamie Leech
相关产品推荐
相关产品推荐

