2013-10-21 57 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 ... –

相关问题