注意:我正在使用MonoTouch。
当我第二次单击tbName(textfield,见下面的代理)时,我得到以下异常。第一次模态视图出现没有问题,我解雇它(代码也在下面提供)。但是第二次点击tbName(顺便说一下Textfield),我得到了这个例外:
“抛出Objective-C异常。名称:NSInternalInconsistencyException原因:在转换已经进行时尝试进行模态转换。等待viewDidAppear / viewDidDisappear知道当前转换已完成”
事情是,在点击之前我等待多久并不重要,所以我认为我缺少一个基本的
From the NewEnvelopeViewController class:
public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
tbName.TouchDown += delegate(object sender, EventArgs e) {
// Set everything up for the editting of the envelope's name
_dataViewController.NumericPad = false;
_dataViewController.FieldType = NewEnvelopeDataViewController.Fields.Name;
_dataViewController.EnvelopeToEdit = _envelope;
this.PresentModalViewController(_dataViewController, true);
};
From the NewEnvelopeDataViewController class:
public override void ViewDidAppear(bool animated) { base.ViewDidAppear(动画);
if (NumericPad) {
tbValueArea.KeyboardType = UIKeyboardType.DecimalPad;
}
else {
tbValueArea.KeyboardType = UIKeyboardType.Default;
}
switch (FieldType) {
case Fields.Name:
NavigationItem.Title = "Enter the name";
tbValueArea.Text = EnvelopeToEdit.Name;
tbValueArea.KeyboardType = UIKeyboardType.Default;
break;
case Fields.Budget:
NavigationItem.Title = "Set your budget";
tbValueArea.Text = EnvelopeToEdit.Budget.ToString();
tbValueArea.KeyboardType = UIKeyboardType.DecimalPad;
break;
case Fields.Remainder:
NavigationItem.Title = "What remains of your budget?";
tbValueArea.Text = "0";
tbValueArea.KeyboardType = UIKeyboardType.DecimalPad;
break;
default:
throw new NotImplementedException("ViewDidAppear has a FieldType not accounted for");
}
}
partial void clickedDone (UIBarButtonItem sender)
{
switch (FieldType) {
case Fields.Name:
EnvelopeToEdit.Name = tbValueArea.Text;
break;
case Fields.Budget:
break;
default: // Not implemented yet
throw new NotImplementedException("FieldType not accounted for yet");
break;
}
this.ParentViewController.DismissModalViewControllerAnimated(true);
}
我在StackOverflow上看过一篇关于与DidAppear做某事的文章,但它似乎不适用于我的情况,并且不清楚问题到底是什么(而不仅仅是修补它)。
答案 0 :(得分:2)
移动以下代码,
tbName.TouchDown += delegate(object sender, EventArgs e) {
// Set everything up for the editting of the envelope's name
_dataViewController.NumericPad = false;
_dataViewController.FieldType = NewEnvelopeDataViewController.Fields.Name;
_dataViewController.EnvelopeToEdit = _envelope;
this.PresentModalViewController(_dataViewController, true);
};
从ViewDidAppear方法到ViewDidLoad方法。 ViewDidAppear会在视图出现时触发每次,包括模态视图控制器被解除时。因此,您的代码现在正在做的是向对象的TouchDown事件添加另一个处理程序,因此当它被触发时,它总是再执行一次额外的时间,从而导致多次呈现相同的模态视图控制器。这就是为什么它第一次工作,但第二次崩溃。
通常,如果您想订阅ViewDidAppear中的事件,请务必在ViewDidDisappear中取消订阅,或者更好的是,始终在ViewDidLoad中订阅事件并在ViewDidUnload中取消订阅。