2014-11-13 45 views
1

我試圖在UIPickerView的文本左側插入圖像。我的應用程序崩潰,它沒有圖像數組,但我不確定我做錯了什麼。我很新,請幫忙。謝謝!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

你的應用崩潰在哪裏?什麼是信號或異常? – HAS

+0

在main.m中線程1:信號SIGBART返回UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class])); – Jeff

+1

好的,問題在於你的'imageData'不包含圖像,而是字符串(文件名)。將您的'pickerImageView.image = imageData [row];'更改爲'pickerImageView.image = [UIImage imageNamed:imageData [row]];' – HAS

回答

1

imageData數組不包含圖像數據,但NSString的與圖像的文件名。

您現在有兩個辦法可以改變你的代碼:

  1. 加載圖像到數組(有他們的陣列中的所有的時間)。
  2. 只存儲數組中的路徑(就像你已經做過的那樣),並在需要時加載圖像。 (可能命名的磁盤陣列,因爲它不保存圖像數據)

你可能會認爲第二個具有性能影響,因爲你首先需要從文件加載圖像,然後它被解碼和顯示。但是,如果您使用UIImage的imageNamed:類方法,圖像會變得混亂。另一方面,如果你採用第一種解決方案,你最終可能會浪費內存(我想這些圖像非常小,所以不應該這樣)。

爲你會做以下的第一sution:

NSArray *imageData = @[[UIImage imageNamed:@"image1.png"], [UIImage imageNamed:@"image2.png"]]; 

沒有別的需要改變(雖然喜歡它含有NSData對象我會說出陣列images因爲imageData聽起來

爲。第二個選擇,你會改變

pickerImageView.image = imageArray[row]; 

pickerImageView.image = [UIImage imageNamed:imageArray[row]]; 

這裏沒有其他改變,但我會將imageData重命名爲imageFileNames

請記住,您選擇變量名越好越好,不僅別人更好,而且您自己也能理解發生了什麼,以及哪裏可能是錯誤。