2011-04-26 73 views
1

我有一個在MonoTouch 3.2.6下運行的應用程序; MonoTouch 4.0.1下的相同應用程序在啓動任何觸摸事件時發生崩潰。僅在MonoTouch 4.0.1中啓動事件時應用程序崩潰

讀另一個問題,在source,我知道問題在於從GC收集的對象,但我看不到哪一個是。應用程序啓動並加載TabBar,但單擊任何TabItem會使應用​​程序崩潰。該文件main.cs和TabDelegate.cs列舉如下:Main.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using System.Drawing; 
using IPadApp.Classes; 
using AggiornamentiCL; 


namespace VSViewer 
{ 
    public class Application 
    { 
     static void Main (string[] args) 
     { 
      UIApplication.Main (args); 
     } 
    } 


    // The name AppDelegate is referenced in the MainWindow.xib file. 
    public partial class AppDelegate : UIApplicationDelegate 
    { 
     public static UITabBar tabmain ; 
     public static UIViewController ctrMain; 
     public static Home ctrHome; 
     public static UIView viewMain; 

     public static WrapperMenu MenuManager; 
     public static WrapperValueStories ValueStoriesManager; 
     public static WrapperBibliography BibliographyManager; 
     public static WrapperStakeHolder StakeHolderManager; 

     public static Aggiornamento AggiornamentoManager; 

     public static string RegionId = ""; 
     public static string RegionName= ""; 


     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
     { 
      // Reperisco il RegionName dai settings 
      RegionName= NSUserDefaults.StandardUserDefaults.StringForKey("regione"); 
      // Inizializzo le variabili 
      tabmain = tabMain; 
      ctrMain = ctrmain; 
      viewMain = viewContent; 
      ctrHome = new Home(String.Empty, RegionName); 
      // Inizializzo i manager 
      MenuManager= new WrapperMenu(); 
      ValueStoriesManager= new WrapperValueStories(ref viewMain); 
      BibliographyManager = new WrapperBibliography(); 
      StakeHolderManager = new WrapperStakeHolder(); 
      AggiornamentoManager = new Aggiornamento(ctrMain); 


      // Imposto i delegati 
      tabmain.Delegate = new TabDelegate(viewMain, 
               ctrMain, 
               MenuManager, 
               ValueStoriesManager, 
               BibliographyManager, 
               StakeHolderManager, 
               AggiornamentoManager); 



      // Reperisco il Root Menu 
      MenuManager.GetRootMenu(ref tabmain); 

      if(string.IsNullOrEmpty(RegionName) || String.IsNullOrEmpty(Utils.GetRegionIDByName(RegionName))) 
       MenuManager.SoloRegioni(ref tabmain,false); 
      else 
      { 
       RegionId = Utils.GetRegionIDByName(RegionName); 
       Utils.LoadSplash(viewMain,"",RegionName); 
      } 
      // If you have defined a view, add it here: 
      window.AddSubview (ctrMain.View); 

      window.MakeKeyAndVisible(); 

      Thread tAggiornaDati = new Thread(new ThreadStart(Aggiornamento.AggiornaDati)); 
      tAggiornaDati.Start(); 

      return true; 

     }   
    } 
} 

TabDelegate.cs:

using System; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using IPadApp.Classes; 
using System.Collections.Generic; 
using System.Linq; 
using System.Drawing; 

namespace VSViewer 
{ 
    public class TabDelegate : UITabBarDelegate 
    { 
     private WrapperMenu MenuManager;   
     private WrapperValueStories ValueStoriesManager; 
     private WrapperBibliography BibliographyManager; 
     private WrapperStakeHolder StakeHolderManager; 
     private Aggiornamento AggiornamentoManager; 

     private UIView viewMain; 
     //private UIViewController ctrmain; 
     private NodeAction previousAction ; 
     private int previousNode=0; 

     public TabDelegate (UIView pviewMain,       
          UIViewController pctrMain, 
          WrapperMenu pMenuManager, 
          WrapperValueStories pValueStoriesManager, 
          WrapperBibliography pBibliographyManager, 
          WrapperStakeHolder pStakeHolderManager, 
          Aggiornamento pAggiornamento) 
     { 
      viewMain = pviewMain; 
      MenuManager = pMenuManager; 
      ValueStoriesManager = pValueStoriesManager; 
      BibliographyManager= pBibliographyManager; 
      StakeHolderManager = pStakeHolderManager; 
      AggiornamentoManager = pAggiornamento; 
     } 

     private int GetSelectedTabBarIndex (UITabBar tabbar, UITabBarItem item) 
     { 
      for (int i = 0; i < tabbar.Items.Count(); i++) { 
       if (item == tabbar.Items[i]) 
        return i; 
      } 

      return -1; 
     } 

     public override void ItemSelected (UITabBar tabbar, UITabBarItem item) 
     { 
      int itemSelectedIndex = GetSelectedTabBarIndex (tabbar, item); 
      MerqurioMenuNode currentNode = MenuManager.GetCurrentNodeByPos (itemSelectedIndex); 

      if (!(previousAction==currentNode.Action && previousNode == currentNode.MenuID) || 
        currentNode.Action== NodeAction.OpenSubMenu) 
      { 
      // Rimuovo tutte le immagini della VS che sto abbandonando 
       if (previousAction== NodeAction.OpenValueStory) ValueStoriesManager.RemoveAllSlides(); 
       // Detacho la View dell'azione precedente 
       foreach (UIView subView in this.viewMain.Subviews) 
       { 
        subView.RemoveFromSuperview(); 
        subView.Dispose(); 
       } 
       // Mostro la view corretta 
       switch (currentNode.Action) { 
        case NodeAction.OpenSubMenu: 
         MenuManager.GetMenuByNodeId (ref tabbar, itemSelectedIndex); 
         // Imposto la breadcrumb 
         if (currentNode.ParentMenuID==0 && currentNode.Direction== NodeDirection.Forward) Breadcrumb.SetMolecola(currentNode.ViewLabel); 
         else if (currentNode.ParentMenuID==0 &&currentNode.Direction== NodeDirection.Backward) Breadcrumb.SetMolecola(""); 
         Breadcrumb.UpdateBreadcrumb(currentNode.ViewLabel, AppDelegate.RegionName); 
         // Mostro la Splash 
         Utils.LoadSplash(viewMain,currentNode.ViewLabel,AppDelegate.RegionName); 
         break; 
        case NodeAction.OpenValueStory: 
         ValueStoriesManager.ShowValueStory (currentNode, AppDelegate.RegionId); 
         break; 
        case NodeAction.OpenBibliography:    
         BibliographyManager.ShowBibliography(viewMain,currentNode.FileName); 
         break; 
        case NodeAction.OpenStakeHolder:     
         StakeHolderManager.ShowStakeHolder(viewMain); 
         break; 
        case NodeAction.OpenRegion: 
         Regioni ctrRegioni = new Regioni(); 
         this.viewMain.AddSubview(ctrRegioni.View); 
         break; 
        case NodeAction.OpenSimulator1: 
         Simulator_1 ctrSimulator1 = new Simulator_1(); 
         this.viewMain.AddSubview(ctrSimulator1.View); 
         break; 
        case NodeAction.OpenSimulator2: 
         Simulator_2 ctrSimulator2 = new Simulator_2(); 
         this.viewMain.AddSubview(ctrSimulator2.View); 
         break; 
       case NodeAction.OpenAggiornamento: 
         this.viewMain.AddSubview(AggiornamentoManager.View); 

         break; 
        default: 
         break; 
       } 

      } 

      // Aggiorno i contatori 
      previousAction = currentNode.Action; 
      previousNode = currentNode.MenuID; 
     } 
    } 
} 

請幫助..我無法找到任何舊文件的MonoTouch 3.2.6 ...

回答

0

當我看着你的Main.cs文件時,你有一個模式,除了其中一個是相反的。

 **tabmain = tabMain**; 
     ctrMain = ctrmain; 
     viewMain = viewContent; 

我想你可能是指tabMain = tabmain;

+0

我不是代碼的作者。我知道這似乎很奇怪,或者令人困惑,但代碼是正確的。正如你所看到的,聲明(public static)是tabman,ctrMain和viewMain ..而tabMain,ctrmain和viewContent是在Interface Builder中聲明的插座。 – Vik 2011-04-27 06:40:38