![](/img/trans.png)
[英]CommitEditingStyle of Monotouch.Dialog RootElement
[英]MonoTouch.Dialog crash
我有一個小型測試應用程序,它僅在3頁之間循環。 這是AppDelegate:
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
_session = new Session();
_session.NextScreen += (screenIndex) =>
{
window.RootViewController = _viewControllers[screenIndex];
};
_viewControllers.Add(new Screen0(_session));
_viewControllers.Add(new Screen1(_session));
_viewControllers.Add(new Screen2(_session));
// create a new window instance based on the screen size
window = new UIWindow (UIScreen.MainScreen.Bounds);
// If you have defined a view, add it here:
// window.AddSubview (navigationController.View);
window.RootViewController = _viewControllers[0];
// make the window visible
window.MakeKeyAndVisible ();
return true;
如果我在每個屏幕上都放一個按鈕,則可以在頁面之間導航,即
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
UIButton button = new UIButton(new RectangleF(30, 200, 80, 34));
button.SetTitle("Go to 1", UIControlState.Normal);
button.TouchUpInside += (sender, e) =>
{
_session.ExittingScreen = 0;
};
View.AddSubview(button);
}
當我使用MonoTouch.Dialog時,間歇性崩潰。 這是我的代碼:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var rootElement = new RootElement("Register")
{
new Section()
{
new EntryElement("First Name", "required", ""),
new EntryElement("Last Name", "required", ""),
new EntryElement("Email Address", "required", ""),
new EntryElement("Password", "required", "")
},
new Section()
{
new StyledStringElement("Submit you information", () => { _session.ExittingScreen = 1; })
}
};
var dialogViewController = new DialogViewController(rootElement);
var navigationController = new UINavigationController(dialogViewController);
View.Add (navigationController.View);
和轉儲:
在(包裝器原生管理)MonoTouch.UIKit.UIApplication.UIApplicationMain(int,string [],intptr,intptr)<0xffffffff>在MonoTouch.UIKit.UIApplication.Main(string [],string,string)<0x000b7>在MTD.Application.Main(string [])<0x00017>在(包裝運行時調用).runtime_invoke_void_object(object,intptr,intptr,intptr)在<0xffffffff>
本機堆棧跟蹤:
0 MTD 0x00090b7c mono_handle_native_sigsegv + 284
1 MTD 0x00005f28 mono_sigsegv_signal_handler + 248
2 libsystem_c.dylib 0x97da559b _sigtramp + 43
3 ??? 0xffffffff 0x0 + 4294967295
4 UIKit 0x02220952 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 201
5 Foundation 0x0173786d __NSFireDelayedPerform + 389
6 CoreFoundation 0x01195966 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
7 CoreFoundation 0x01195407 __CFRunLoopDoTimer + 551
8 CoreFoundation 0x010f87c0 __CFRunLoopRun + 1888
9 CoreFoundation 0x010f7db4 CFRunLoopRunSpecific + 212
10 CoreFoundation 0x010f7ccb CFRunLoopRunInMode + 123
11 GraphicsServices 0x04789879 GSEventRunModal + 207
12 GraphicsServices 0x0478993e GSEventRun + 114
13 UIKit 0x02190a9b UIApplicationMain + 1175
14 ??? 0x09ff6774 0x0 + 167733108
15 ??? 0x09ff5958 0x0 + 167729496
16 ??? 0x09ff57f0 0x0 + 167729136
17 ??? 0x09ff587f 0x0 + 167729279
18 MTD 0x0000a292 mono_jit_runtime_invoke + 722
19 MTD 0x0016a17e mono_runtime_invoke + 126
20 MTD 0x0016e264 mono_runtime_exec_main + 420
21 MTD 0x00173685 mono_runtime_run_main + 725
22 MTD 0x00067495 mono_jit_exec + 149
23 MTD 0x002116c9 main + 2825
24 MTD 0x000032e5 start + 53
25 ??? 0x00000005 0x0 + 5
我是在做錯什么,還是一個錯誤? 謝謝。
避免使用以下模式:
var navigationController = new UINavigationController(dialogViewController);
View.Add (navigationController.View);
因為一旦完成View.Add
調用並且垃圾收集器可以處置它(無論何時需要),就不會(在托管方面)引用navigationController
。 但是,從本地角度來看,它將存在。 從本地實例返回托管實例的調用將使您的應用程序崩潰。
正確的模式是將navigationController
聲明為您類型的字段(而不是局部變量),並在方法中創建/分配它。 只要父實例存在,這將使對navigationController
的引用保持活動狀態(並確保任何回調都不會轉到已處置的對象)。
例如
private UINavigationController navigationController;
...
public override void ViewDidLoad ()
{
...
var dialogViewController = new DialogViewController(rootElement);
navigationController = new UINavigationController(dialogViewController);
View.Add (navigationController.View);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.