0

ビューの読み込み時にイベントハンドラーを持つ uivewcontroller があります。バックグラウンドで起動するコードと UI が含まれているため、UI コードでは InvokeOnMainThread を使用しています。別のコントローラーに移動して戻るまで、正常に動作します。イベントが発生しても、UI コードは実行されません。このコントローラーにプッシュするたびに、新しいインスタンスを作成しています。だから私はそれをこのコントローラーの1つのインスタンスだけにしようとしましたが、うまく動作します!!!! なぜこれが起こっているのか、誰かが私に説明できますか??!!

        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));

        });
    }
4

2 に答える 2

2

まず、ここでInvokeOnMainThreadを使用する必要はありません。TouchUpInsideはメイン スレッドで起動することが保証されているからです。

2 番目の問題は、sendButtonフィールドは静的ですが、コントローラー インスタンスは静的ではないことです。そのため、コントローラーの最初のインスタンスにのみ追加されます。static キーワードを削除すると、機能するはずです。

于 2013-10-21T11:39:05.000 に答える
1

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/ViewDidUnloadiOS 6 で廃止されたため、この種の作業を行う必要はなくなりDidReceiveMemoryWarningました。代わりに、メソッドにクリーンアップ コードを配置することをお勧めします。
  • あなたのコードはすでにメインループで実行されています -InvokeOnMainThread不要です。
于 2013-10-21T11:42:27.100 に答える