我有一个UIPickerViewModel
,它应该在所选值发生变化时触发事件,但是在调用Selected
时,EventHandler
为空。代码(稍微简化):
public class MyPickerViewModel: UIPickerViewModel {
public event EventHandler SelectionChanged;
public void PrintWhetherSelectionChangedIsNull() {
System.Console.WriteLine(SelectionChanged == null ? "yes" : "no");
}
public override void Selected(UIPickerView picker, int row, int comp) {
if (SelectionChanged != null) { // it always is, though
SelectionChanged(this, new EventArgs());
}
}
}
public class SomeView: UIView {
SomeView(MyPickerViewModel model) {
model.SelectionChanged += delegate(object s, EventArgs e) {
DoSomething();
}
model.PrintWhetherSelectionChangedIsNull(); // prints "no"
}
private void DoSomething() { /* never called */ }
}
我很确定该模型只有一个实例,并且EventHandler
在再次变为null之前是非空的。
我猜测我添加到EventHandler
的代表正在收集垃圾或其他东西,但这只是猜测。有人能指出我对C#/ iOS对象生命周期的一个很好的入门读物吗?
更新:我尝试在视图上使用名为EventHandler
的实例变量,问题仍然存在。所以这不仅仅是一个垃圾收集问题。
答案 0 :(得分:0)
尝试更新SomeView,以便存储模型值,只是为了确保它不会因某种原因释放自身的引用。
public class SomeView: UIView {
MyPickerViewModel _model;
SomeView(MyPickerViewModel model) {
_model = model;
_model.SelectionChanged += delegate(object s, EventArgs e) {
DoSomething();
}
_model.PrintWhetherSelectionChangedIsNull(); // prints "no"
}
private void DoSomething() { /* should be called now */ }
}