更改计时器iOS的背景Xamarin

问题描述:

我正在构建一个iOS应用程序,我试图每隔几秒更改背景图像。我设置了使用代码从这里定时器:https://developer.xamarin.com/api/type/System.Threading.Timer/更改计时器iOS的背景Xamarin

我的代码如下所示:

using System; 
using System.Threading; 

using UIKit; 

namespace TestApp 
{ 
    public partial class ViewController : UIViewController 
    { 
    // New Timer 
    class BackgroundTimer 
    { 
     public int counter = 0; 
     public Timer tmr; 

    } 
    // Load screen 
    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     BackgroundTimer s = new BackgroundTimer(); 
     // Create the delegate that invokes methods for the timer. 
     TimerCallback timerDelegate = new TimerCallback(ChangeBackground); 

     // Create a timer that waits three seconds, then invokes every three seconds. 
     Timer timer = new Timer(timerDelegate, s, 3000, 3000); 

     // Keep a handle to the timer, so it can be disposed. 
     s.tmr = timer; 

     void ChangeBackground(Object state) 
     { 
      BackgroundTimer t = (BackgroundTimer)state; 
      t.counter++; 
      Background.Image = UIImage.FromBundle("HydePark"); 
     } 

当我在模拟器中运行它,我得到以下错误:

UIKit.UIKitThreadAccessException has been thrown 

UIKit Consistency error: you are calling a UIKit method that can only 
be invoked from the UI thread. 

我我不确定那是什么意思。

更新/编辑:(2017年7月23日)

下面的问题解决了我的问题。我想循环图像,所以我做了一个随机生成器,但它只循环一次图像。

// Load screen 
    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     // Random number generator 
     Random RandomImage = new Random(); 
     int RandomImg = RandomImage.Next(1, 6); 
     string image = ""; 

     // Switch statement for displaying different messages 
     switch (RandomImg) 
     { 
      case 1: 
       image = "Image1"; 
       break; 
      case 2: 
       image = "Image2"; 
       break; 
      case 3: 
       image = "Image3"; 
       break; 
      case 4: 
       image = "Image4"; 
       break; 
      case 5: 
       image = "Image5"; 
       break; 
     } 

     BackgroundTimer s = new BackgroundTimer(); 
     // Create the delegate that invokes methods for the timer. 
     TimerCallback timerDelegate = new TimerCallback(ChangeBackground); 

     // Create a timer that waits three seconds, then invokes every three seconds. 
     Timer timer = new Timer(timerDelegate, s, 3000, 3000); 

     // Keep a handle to the timer, so it can be disposed. 
     s.tmr = timer; 

     void ChangeBackground(Object state) 
     { 
      BackgroundTimer t = (BackgroundTimer)state; 
      t.counter++; 
      InvokeOnMainThread(() => 
      { 
       Background.Image = UIImage.FromBundle(image); 
      }); 

     } 
+0

我想我需要一个循环,但我不知道如何去做。 –

更新UI要求,你是主线程(UI线程)上,把你的Background.Image呼叫的InvokeOnMainThread内就能解决UIKit例外:

void ChangeBackground(Object state) 
{ 
    BackgroundTimer t = (BackgroundTimer)state; 
    t.counter++; 
    InvokeOnMainThread(() => 
    { 
     Background.Image = UIImage.FromBundle("HydePark"); 
    }); 
} 

Xamarin有提供指导为什么/如何做这些需求概述:

+0

这个工程!非常感谢!如果您可以请求帮助,我还有一个问题。我编辑/更新了我的问题。我想让它循环图像,但它只循环一次。 –