我有一个继承了UIAlertView的传统C#类,用于提示用户输入IP地址。它还将保留IP地址并将其作为默认条目值加载。

原始代码破解了iOS4.x UIAlertView以添加文本字段,并且它存在一些布局问题。我将代码转换为使用iOS5 UIAlertViewAlertViewStyle设置,并且一切正常。

要求我启用弹出键盘上的“完成”键,以便它可以作为“连接”按钮的快捷方式。我向类的构造函数添加了以下代码:

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 += ...行并再次进行测试。如果它没有崩溃,那么这就是解决方案。

07-24 09:55
查看更多