1

*アップデート***

私の最初の説明 (現在は削除されています) は実際の状況ではありませんでした。問題の簡易版です。

完全な状況:

iPhoneフォトギャラリーから選択した画像でUIImageView内のUIImageを変更したい。このために、MediaPicker (Xamarin ライブラリの一部) を使用しました。

ボタンをクリックすると、Mediapicker が作成されます。次に、フォト ギャラリーから写真を撮る関数を呼び出します。このメソッドは 2 つの引数を必要とします。Mediapicker とコールバック関数。--> PictureFromGallery(mediaPicker, CallbackPhotoMade); このコールバック関数は、ユーザーが写真ライブラリでアップロードする写真を選択した後にトリガーされます。

このコールバック関数内で、UIImageView の UIImage を変更したいと考えています。

void CallbackPhotoMade(MediaFile obj)
{
    imageviewPhoto1.Image = UIImage.FromFile("Images/image2.PNG");
    //To test I just use a file from a folder in my project
}

上記の関数 (CallbackPhotoMade) をブレークポイントし、テキスト ".Image =" にマウスを置くと、次のメッセージが表示 されます。 UI スレッド

UIImageView内のUIImageが変わらないのはこれが問題だと思います。

誰もこれを解決する方法を知っていますか?

*UPDATE2*** 別のトピックで、次のように CheckForIllegalCrossThreadCalls を false に設定することで解決できることを読みました。

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    UIApplication.CheckForIllegalCrossThreadCalls = false;
}

残念ながらイメージは変わりません。ただし、特定のエラーは消えました。

4

2 に答える 2

4

これを試してください:

void CallbackPhotoMade(MediaFile obj)
{
    InvokeOnMainThread(() => { 
        imageviewPhoto1.Image = UIImage.FromFile("Images/image2.PNG"); 
    });
    //To test I just use a file from a folder in my project
}

行った設定は、チェックを無効にするだけで、例外を防ぎません。

コールバックは別のスレッド (非同期) で行われます。また、メイン スレッド上で、またはメイン スレッドからのみユーザー インターフェイスを更新できます/更新する必要がありますInvokeOnMainThread()コードをメインスレッドで実行します。これはまさに必要なものです。

于 2013-01-19T19:11:27.923 に答える
0

コードが実行されるのが理想的です。changeImage メソッドで imageviewPhoto1 が nill かどうかを確認します。nill の場合、オブジェクトはおそらく解放されます。

nill でない場合は、[self.view setNeedsDisplay]; と書いてみてください。image を設定した後、ビューを再描画して更新できるかどうかを確認するだけです。または、imageviewPhoto1 の背景色を別の色に設定して、ビューが存在するかどうかを試してください。

于 2013-01-19T17:38:26.850 に答える