事件处理程序触发但不执行 UI 代码 (MonoTouch)
本文关键字:代码 UI MonoTouch 执行 程序 事件处理 | 更新日期: 2023-09-27 18:36:08
我有一个uivewcontroller,它在视图加载时具有事件处理程序.it包含在后台触发的代码以及UI,因此对于UI代码,我使用InvokeOnMainThread。 它工作正常,直到我导航到另一个控制器并返回它。 当事件触发时,它不会执行 UI 代码。 每次我推送到这个控制器时,我都会创建一个新的实例。 所以我试图只做此控制器的一个实例,它可以正常工作!!!谁能向我解释为什么会发生这种情况??!!
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));
});
}
首先,这里不需要使用 InvokeOnMainThread,因为 TouchUpInside 保证在主线程上触发。
第二个问题是您的 sendButton 字段是静态的,但您的控制器实例不是。这就是为什么它只被添加到控制器的第一个实例中。删除静态关键字,它应该可以工作。
您几乎总是应该永远不要使用static
UI组件,这几乎总是会导致问题。任何类型的UI构建通常都以LoadView
方法完成,任何类型的事件连接/视图设置都应以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
/ViewDidUnload
在iOS 6中已弃用,因此您不再需要执行此类操作,建议您将清理代码放在DidReceiveMemoryWarning
方法中。 - 您的代码已经在主循环中运行 -
InvokeOnMainThread
是不必要的。