我有一个继承了UIAlertView
的传统C#类,用于提示用户输入IP地址。它还将保留IP地址并将其作为默认条目值加载。
原始代码破解了iOS4.x UIAlertView
以添加文本字段,并且它存在一些布局问题。我将代码转换为使用iOS5 UIAlertView
的AlertViewStyle
设置,并且一切正常。
要求我启用弹出键盘上的“完成”键,以便它可以作为“连接”按钮的快捷方式。我向类的构造函数添加了以下代码:
public AddressAlertView()
{
AddButton("Cancel");
AddButton("Connect");
AlertViewStyle = UIAlertViewStyle.PlainTextInput;
// NEW - get input text field, enable Done on the keyboard and
// allow Done to be the same as the Connect button
UITextField fld = GetTextField(0);
fld.ReturnKeyType = UIReturnKeyType.Done;
fld.ShouldReturn = (textField) =>
{
DismissWithClickedButtonIndex(1, true);
return textField.ResignFirstResponder();
};
// *** end of new code ***
// restore saved IP address
string savedAddress = NSUserDefault.StandardUserDefaults.StringForKey(AddressKey);
if (savedAddress != null)
fld.Text = savedAddress;
}
该类的用法如下:
....
AddressAlertView addrPrompt = new AddressAlertView();
addrPrompt.Title = "IP Address";
addrPrompt.Message = "Enter address";
addrPrompt.Dismissed += (sender, e) =>
{
if (e.ButtonIndex == 1)
{
// use IP address...
....
}
};
addrPrompt.Show();
....
现在的问题。运行此代码时,
AddressAlertView
会正确显示弹出对话框,并且所有操作均与以前一样。但是,如果我点击键盘上的“完成”,则该应用程序会在UIAlertView
中爆炸。我尝试将新代码移至
public override void LayoutSubviews()
方法,但仍然崩溃。有任何想法吗?
最佳答案
您需要将AddressAlertView声明为类成员:
AddressAlertView addrPrompt;
public void DoSomething()
{
addrPrompt = new AddressAlertView();
//etc
}
这种情况下的问题(我与UIAlertViews有很多相似之处)是AddressAlertView对象是GC'd,事件处理程序会导致崩溃。为确保这是问题所在,请勿更改任何内容,只需删除/注释
addrPrompt.Dismissed += ...
行并再次进行测试。如果它没有崩溃,那么这就是解决方案。