0

コンポーネントが 1 つしかない UIImagePicker に画像を実装しようとしています。uimageview と uilabel を追加します。キャッチは、最初の行には画像がなく、3行目には正しいと信じていることです。私の問題は、各行の画像が異なることです。これを解決するために、それらを画像の配列に入れてから、渡された行に基づいて画像を表示します。でも; それは私にとってはうまくいかず、同じ画像が何度も表示されるようです。誰でも理由を教えてもらえますか? 前もって感謝します!

imageNames= [[NSArray alloc] initWithObjects:@"9_stars.png", @"8_stars.png",@"7_stars.png",@"6_stars.png",@"5_stars.png",@"4_stars.png", nil]; 

/

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
    forComponent:(NSInteger)component reusingView:(UIView *)view {

NSString *imageName= [imageNames objectAtIndex:theRow];
NSLog (@"the image name is %@", imageName);
NSLog (@"the current count is %d", theRow);

if(component == 0)
{
    if (row == 0 || row == 17)
    {

        UILabel *channelLabel = [[UILabel alloc] initWithFrame:CGRectMake(-80, 0, 320, 60)];
        channelLabel.text = [currentLottoNames objectAtIndex:row];
        channelLabel.textAlignment = UITextAlignmentLeft;
        channelLabel.backgroundColor = [UIColor clearColor];
        channelLabel.font = [UIFont boldSystemFontOfSize:20];
        channelLabel.backgroundColor = [UIColor clearColor];
        channelLabel.shadowColor = [UIColor whiteColor];
        channelLabel.shadowOffset = CGSizeMake (0,1);

        UIView *tmpView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 110, 60)];

        [tmpView insertSubview:channelLabel atIndex:0];
        return tmpView;

    }
    else {
        UIImage *img = [UIImage imageNamed:imageName];
        UIImageView *temp = [[UIImageView alloc] initWithImage:img];        
        temp.frame = CGRectMake(120, 15,70, 27);

    UILabel *channelLabel = [[UILabel alloc] initWithFrame:CGRectMake(-80, 0, 320, 60)];
    channelLabel.text = [currentLottoNames objectAtIndex:row];
    channelLabel.textAlignment = UITextAlignmentLeft;
    channelLabel.backgroundColor = [UIColor clearColor];
    channelLabel.font = [UIFont boldSystemFontOfSize:20];
    channelLabel.backgroundColor = [UIColor clearColor];
    channelLabel.shadowColor = [UIColor whiteColor];
    channelLabel.shadowOffset = CGSizeMake (0,1);

    UIView *tmpView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 110, 60)];
   [tmpView insertSubview:channelLabel atIndex:0];
    [tmpView insertSubview:temp atIndex: 1];
    return tmpView;
}
   }
 }

編集されたコード

 -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
    forComponent:(NSInteger)component reusingView:(UIView *)view {

NSString *imageName= [imageNames objectAtIndex:row]; // This is where the issue is I believe. What do I use to go through the whole image array?
NSLog (@"the image name is %@", imageName);
NSLog (@"the current count is %d", row);

if(component == 0)
{

       UILabel *channelLabel = [[UILabel alloc] initWithFrame:CGRectMake(-80, 0, 320, 60)];
        channelLabel.text = [currentLottoNames objectAtIndex:row];
        channelLabel.textAlignment = UITextAlignmentLeft;
        channelLabel.backgroundColor = [UIColor clearColor];
        channelLabel.font = [UIFont boldSystemFontOfSize:20];
        channelLabel.backgroundColor = [UIColor clearColor];
        channelLabel.shadowColor = [UIColor whiteColor];
        channelLabel.shadowOffset = CGSizeMake (0,1);

        UIImage *img = [UIImage imageNamed:imageName];
        UIImageView *temp = [[UIImageView alloc] initWithImage:img];        
        temp.frame = CGRectMake(120, 15,70, 27);

    UILabel *channelLabel = [[UILabel alloc] initWithFrame:CGRectMake(-80, 0, 320, 60)];
    channelLabel.text = [currentLottoNames objectAtIndex:row];
    channelLabel.textAlignment = UITextAlignmentLeft;
    channelLabel.backgroundColor = [UIColor clearColor];
    channelLabel.font = [UIFont boldSystemFontOfSize:20];
    channelLabel.backgroundColor = [UIColor clearColor];
    channelLabel.shadowColor = [UIColor whiteColor];
    channelLabel.shadowOffset = CGSizeMake (0,1);

    UIView *tmpView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 110, 60)];

    [tmpView insertSubview:channelLabel atIndex:0];
    [tmpView insertSubview:temp atIndex: 1];
    return tmpView;
 }
 }
4

1 に答える 1

0

あなたの問題は「theRow」です-このメソッドでも定義されていません。配列にプレースホルダー文字列を配置するだけです。つまり、位置 0 と 17 に @"" を配置します。これで、「行」を使用して配列にインデックスを付けることができ、すべてがうまくいきます。

編集: したがって、コードは 18 行あり、ほとんどの行に画像を表示したいが、行 0 と 17 に対して何か異なることを行うことを意味します。したがって、サイズ 18 の配列が必要です。

imageNames= [[NSArray alloc] initWithObjects:
@"", // row 0 unused
// 1 - 6
@"9_stars.png", @"8_stars.png",@"7_stars.png",@"6_stars.png",@"5_stars.png",@"4_stars.png", nil]; 
// 7 - 12
@"9_stars.png", @"8_stars.png",@"7_stars.png",@"6_stars.png",@"5_stars.png",@"4_stars.png", nil]; 
// 13 - 16
@"9_stars.png", @"8_stars.png",@"7_stars.png",@"6_stars.png",
// 17
@"" // not used
// keep adding
nil]; 

概念は、行と同じ数のオブジェクトが常に配列内にあることを保証することです。

このメソッドの開始時にアサートを追加できます。

assert(row < [imageNames count]);

あなたが真実であると信じていることがそうではないことが判明した場合、例外が発生します。

于 2012-08-21T01:37:45.750 に答える