私は、ユーザにIPアドレスの入力を促すために、UIAlertView
を拡張するレガシーC#クラスを持っています。また、IPアドレスを保持し、デフォルトのエントリ値としてロードします。UIAlertViewでMonoTouchランタイムがクラッシュする理由を教えてください。
元のコードは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を宣言する必要が
申し訳ありませんが、まだコメントの書式を学習しています。理解した。 MonoTouchのトレースダンプの出力を見ると、無効なオブジェクトが記述されていました。テキストフィールドをローカル変数として取得する代わりに、インスタンス変数として参照を保存します。 'private UITextField _addressTextField = null;'コンストラクタのコードを '_addressTextField = GetTextField(0);'に変更しました。それはクラッシュを解決した。ローカルの 'UITextField'変数は間違いなくGC'dになり、' ShouldReturn'ラムダ式が呼び出されたときにクラッシュしました。 – hypercode
類似の問題の解決策を探している人を助けるために、あなたの説明を解答し、自分の答えを受け入れるべきです。これは完全に大丈夫であり、StackOverflowで欲しいです。 – Krumelur