2012-02-12 52 views
1

我有一个小测试应用程序,只是在3页之间循环。 这里的AppDelegate:MonoTouch.Dialog崩溃

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(整型,字符串[],IntPtr的,IntPtr的)<为0xffffffff > 在MonoTouch.UIKit.UIApplication.Main(串[],字符串,字符串)< 0x000b7> 在MTD.Application.Main(串[])< 0x00017> 在(包装纸运行时调用).runtime_invoke_void_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

我做错了什么,或者这是一个错误?谢谢。

+0

只是为了澄清,当我触摸“提交”SyledStringElement – user1205691 2012-02-12 23:54:29

回答

0

避免模式,如:

var navigationController = new UINavigationController(dialogViewController); 
View.Add (navigationController.View); 

因为navigationController一旦View.Add调用完成,垃圾收集器可以配置它(只要它想)将不会被引用(在管理侧)。然而从本地方面,它将预计存在。调用返回(从本机管理)到处置的实例将崩溃您的应用程序。

正确的模式是将navigationController声明为您的类型的字段(而不是局部变量)并在方法中创建/分配它。只要父实例存在(并确保任何回调不会到达处置的对象),这将保持navigationController活动的引用。

E.g.

private UINavigationController navigationController; 
... 
public override void ViewDidLoad() 
{ 
    ... 
    var dialogViewController = new DialogViewController(rootElement); 
    navigationController = new UINavigationController(dialogViewController); 

    View.Add (navigationController.View); 
    ... 
} 
+0

谢谢。这似乎阻止了间歇性的崩溃。 – user1205691 2012-02-13 20:51:57

+1

好消息:-)行,如'3 ??? 0xffffffff 0x0 + 4294967295'通常指向一个不存在的实例(当从本地框架调用时更多)。 – poupou 2012-02-13 21:23:04