2013-10-21 55 views
0

我有一個uivewcontroller,它具有視圖加載的事件處理程序.it包含在後臺觸發並在UI中觸發的代碼,因此對於使用InvokeOnMainThread的UI代碼。它工作正常,直到我導航到另一個控制器並返回到它。當事件觸發時,它不執行UI代碼。每次我推到這個控制器,我都會創建一個新的實例。所以我試圖讓它只有這個控制器的一個實例,它工作正常!任何人都可以向我解釋爲什麼會發生這種情況?事件處理程序觸發但不執行UI代碼(MonoTouch)

 public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     if (hubConnection == null) { 
      hubConnection = new HubConnection ("http://" + JsonRequest.IP + ":8070/", "userId=" + userId); 
      hubProxy = hubConnection.CreateHubProxy ("myChatHub"); 
      hubConnection.EnsureReconnecting(); 
      //} 
      if (hubConnection.State == ConnectionState.Disconnected) { 
       hubConnection.Start(); 
      } 
      hubConnection.Received += HandleReceived; 

     } 
    } 

    void HandleReceived (string obj) 
    { 
     InvokeOnMainThread (delegate { 
      discussion.Root [0].Add (new ChatBubble (true, text)); 

     }); 
    } 
+0

看看你的代碼會有所幫助,很多。 – James

+0

發佈您的代碼。 –

+0

這是一個簡單的代碼,我剛剛創建..你需要創建控制器的實例和推,它會顯示第二次你推控制器時,你點擊按鈕,它會觸發,但不會執行處理器 –

回答

2

都沒有必要,因爲需要爲使用InvokeOnMainThread這裏TouchUpInside是保證消防主線程上的第一位。

第二個問題是,您的sendButton字段是靜態的,但您的控制器實例不是。這就是爲什麼它只能添加到控制器的第一個實例中。刪除靜態關鍵字,它應該工作。

+0

實際上這是不是我的確切情況,我只是試圖用一個更簡單的示例來模擬問題,我的確切情況是即時通訊實施信號聊天我的控制器..所以即時初始化我的集線器連接和附加收到的事件..必須有一個對象在整個應用程序中的集線器連接,所以我試圖使它像靜態按鈕樣本..但收到的事件不執行UI代碼..所以我試圖使它非靜態通過發送它作爲參數,但相同問題 !! –

1

你應該幾乎總是從不使用UI組件,這幾乎總是會導致問題。通常在LoadView方法中完成任何類型的UI構建,並且應該在ViewDidLoad例如完成任何類型的事件佈線/視圖設置。

public class TestController : UITableViewController 
{ 
    private UIButton sendButton; 
    ... 
    public override void LoadView() 
    { 
     base.LoadView(); 
     if (sendButton == null) 
     { 
      sendButton = new UIButton (UIButtonType.RoundedRect) 
      { 
       Frame = new RectangleF (100, 100, 80, 50), 
       BackgroundColor = UIColor.Blue 
      }; 
      View.AddSubview(sendButton); 
     } 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     sendButton.TouchUpInside += HandleTouchUpInside; 
    } 

    public override void ViewDidUnload() 
    { 
     if (sendButton != null) 
     { 
      sendButton.Dispose(); 
      sendButton = null; 
     } 
    } 
} 

夫婦的注意事項:

  • ViewDidLoad/ViewDidUnloaddeprecated in iOS 6,所以你不需要做這樣的東西了,建議你把清理代碼在DidReceiveMemoryWarning方法來代替。
  • 您的代碼已經在主循環中運行 - 不需要InvokeOnMainThread
+0

實際上這不是我確切的情況,我只是試圖用一個更簡單的示例來模擬問題,我的確切情況是即時通訊實施信號聊天我的控制器..所以即時初始化我的集線器連接和附加收到的事件..必須有整個應用程序中的集線器連接的一個對象,所以我試圖使它像靜態按鈕樣本..但收到的事件不執行UI代碼..所以我試圖使它非靜態通過發送它作爲參數但同樣的問題! –

+0

@AhmedMohamedAnas好,這是一個相當重要的細節,你應該可能在你的原始問題中記錄......無論如何,你似乎將你的集線器通知綁定到一個UI組件,這不是一個好主意。您應該展示一些代碼,演示您在一分鐘內所做的事情(關於集線器連接等)。目前,你的問題太模糊不清。 – James

+0

我更新了代碼,因爲你看到收到即時消息得到一個字符串消息,即時通訊添加它作爲一個新的元素到tableview ... –

相關問題