我试图在UIPickerView的文本左侧(内部)插入图像。我的应用程序正在崩溃,它没有图像阵列,但我不确定我做错了什么。我很新,请帮忙。谢谢!
·H
#import <UIKit/UIKit.h>
#define kFittingComponent 0
#define kStyleComponent 1
#define kSizeComponent 2
@interface ViewController : UIViewController{
NSArray *PickerData;
NSMutableArray *imageData;
}
@property ( retain, nonatomic) IBOutlet UIPickerView *Picker;
@property ( retain, nonatomic) NSArray *PickerData;
@property ( retain, nonatomic) NSMutableArray *imageData;
@end
的.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize Picker,PickerData,imageData;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {}
return self;}
- (void)viewDidLoad
{[super viewDidLoad];
NSArray *array = [[NSArray alloc] initWithObjects:@"blank",@"one",@"two",nil];
self.PickerData = array;
NSMutableArray *imageArray = [[NSMutableArray alloc]initWithObjects:@"image1.png",@"image2.png", nil];
self.imageData = imageArray;}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return [PickerData count];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view
{
UIView *pickerCustomView = (id)view;
UILabel *pickerViewLabel;
UIImageView *pickerImageView;
if (!pickerCustomView) {
pickerCustomView= [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
[pickerView rowSizeForComponent:component].width - 10.0f, [pickerView rowSizeForComponent:component].height)];
pickerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 35.0f, 35.0f)];
pickerViewLabel= [[UILabel alloc] initWithFrame:CGRectMake(37.0f, -5.0f,
[pickerView rowSizeForComponent:component].width - 10.0f, [pickerView rowSizeForComponent:component].height)];
[pickerCustomView addSubview:pickerImageView];
[pickerCustomView addSubview:pickerViewLabel];
}
pickerImageView.image = imageData[row];
pickerViewLabel.backgroundColor = [UIColor clearColor];
pickerViewLabel.text = PickerData[row];
pickerViewLabel.font = [UIFont fontWithName:@"ChalkboardSE-Regular" size:20];
return pickerCustomView;}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
int long select = row;
if (select == 0){}
else
if (select == 1) {}
else
if (select == 2) {}
}
@end
答案 0 :(得分:1)
您的imageData
数组不包含图像数据,但NSStrings包含图像的文件名。
您现在有两种方法可以更改代码:
您可能认为第二个会影响性能,因为您首先需要从文件加载该图像,然后解码并显示它。但是如果你使用UIImage的imageNamed:
类方法,图像就会受到限制。
另一方面,如果你使用第一个解决方案,你最终会浪费内存(我想这些图像非常小,所以不应该这样)。
对于第一次请求,您将执行以下操作:
NSArray *imageData = @[[UIImage imageNamed:@"image1.png"], [UIImage imageNamed:@"image2.png"]];
没有其他东西需要更改(虽然我会将数组命名为images
,因为imageData
听起来像包含NSData
个对象。
对于第二个选项,您将更改
pickerImageView.image = imageArray[row];
到
pickerImageView.image = [UIImage imageNamed:imageArray[row]];
此处没有其他任何内容可以更改,但我会将imageData
重命名为imageFileNames
。
请记住,您选择变量名称越好,不仅是其他人越好,而是您自己可以理解正在发生的事情以及可能出错的地方。