图像加载多次Monotouch / Xamarin Studio

时间:2014-02-15 08:23:58

标签: xamarin.ios uiimage xamarin xamarin-studio image-loading

这是一个monotouch(Xamarin Studio)iPad应用程序

我有一项调查要求用户查看图像并对其进行评分,有140张图片,它们随机显示。我将这些图像放在一个文件夹中并命名为pic1.jpg,pic2.jpg,pic3.jpg等。在调查开始时,我随机生成1-140的数字数组,确保没有相同的数字两次(这已经过验证并正在工作......)。然后我浏览数组并以随机顺序显示图像。

iOS7更新后,我遇到了显示错误图像的问题。它将在一次测试中多次出现。我已经调试了它,它只是显示的错误图像,几乎就像图像被另一个图像替换一样......例如,当图像81应该显示图像94实际上已经显示。这在140张图片中发生了12次......

以下是评级的代码:

public override void ViewDidLoad ()
{
int[] Num2 = new int[141];  //array for random numbers
int ic  = 0;  //int count
rand2(ref Num2); //routine to generate random numbers...
this.btnSEG.ValueChanged += delegate(object sender, EventArgs e){ //submit the rating
ic = ic + 1; //increase the count
imgSorce.Image.Dispose(); //clear the current image
using (var pool = new NSAutoreleasePool ()) {  //put this in to prevent leaks
this.imgSorce.Image = UIImage.FromFile ("image/pic" + Num2[ic] + ".jpg");  //display the next image
};
};

我已经检查了图像文件夹中的所有图像,并且没有任何重复项。

为什么会发生这种情况?

更新

@Krumelur要求代码生成随机编号的数组......这里是......

private void rand2 (ref int[] rn)
{
int i = 0;
int icount = 0;
 for (i = 0; i <= 139;)
{
int n = 0;
rand3(ref n);
for(icount = 0; icount <= 139;)
{
if (n == rn[icount])
{
icount = 141;
}
icount = icount + 1;
if (icount == 140)
{
rn[i] = n;
i = i+1;
}
}
};
rn[140] = 0;
}

这是上面引用的rand3 ......

private void rand3 (ref int num)
{
Random r = new Random();
num = r.Next(1, 141);
}

1 个答案:

答案 0 :(得分:0)

就个人而言,我认为更好的解决方案是创建您的数组,使用序列号填充它,然后随机播放数组元素。这保证没有重复。以下是执行此操作的示例代码:

int[] Num2 = new int[141]; //array for random numbers
// Fill the array with numbers from 0 to 140
for (int i = 0; i < Num2.Length; i++) {
    Num2[i] = i;
}

// Shuffle Array
Random rnd = new Random((int)DateTime.Now.Ticks); // seed the random number generator based on the time so you don't get the same sequence repeatedly
for (int i = Num2.Length; i > 1; i--) {
    // Pick random element to swap
    int j = rnd.Next(1, 141);
    // Swap
    int temp = Num2[j];
    Num2[j] = Num2[i - 1];
    Num2[i-1] = temp;
}