2016-04-20 1 views
0

Я пишу небольшое приложение iOS, которое, я надеюсь, облегчит работу на моем поле. Я нахожусь в OS X El Capitan 10.11.4, используя Xcode 7.3 и записывая приложение для iOS 9.3.Как экспортировать выбор объекта UIPickerView в файл CSV?

Вот и вся идея: вместо того, чтобы подключать данные к листу бумаги, я хочу написать все в базовое приложение, подобное форме, которое будет использоваться на iPad, а затем приложение переносит данные на файл .csv.

У меня есть все, что выяснено (структура приложения, протокол передачи и получения данных и т. Д.), Но есть одна вещь, которая сводит меня с ума. Прежде чем я покажу вам код, который я использую, вот проблема. Когда я нажимаю кнопку «Сохранить», а затем переходите к проверке сохраненных данных, я не могу получить значение, выбранное объектами UIPickerView, которое будет передано в CSV-файл. Все остальное отлично работает. У меня есть два объекта UIPickerView. В одном у меня есть информация о сексе, закодированная как M, F и M/F; у другого есть информация о возрасте, закодированном как Adu, Juv, Hat. Я бы хотел, чтобы приложение сохраняло выбранное значение, но я не мог этого понять.

Любая помощь очень ценится. Благодарю.

Вот код, который я использую для моего ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate> 
@property (strong, nonatomic) IBOutlet UIDatePicker *day; 
@property (strong, nonatomic) IBOutlet UITextField *species; 
@property (strong, nonatomic) IBOutlet UITextField *island; 
@property (strong, nonatomic) IBOutlet UITextField *cay; 
@property (strong, nonatomic) IBOutlet UITextField *pit; 
@property (strong, nonatomic) IBOutlet UITextField *coordinatesN; 
@property (strong, nonatomic) IBOutlet UITextField *coordinatesW; 
@property (strong, nonatomic) IBOutlet UIPickerView *sex; 
@property (strong, nonatomic) IBOutlet UIPickerView *age; 

- (IBAction)saveInfo:(id)sender; 
- (IBAction)retrieveInfo:(id)sender; 
- (IBAction)retractKeyboard:(id)sender; 

@property (strong, nonatomic) IBOutlet UITextView *resultView; 

@end 

И это код, который я использую для моего ViewConntroller.m

#import "ViewController.h" 

@interface ViewController() 
{ 
    NSArray *pickerDataSex; 
    NSArray *pickerDataAge; 
} 
@end 

@implementation ViewController 

@synthesize resultView; 
@synthesize day; 
@synthesize species; 
@synthesize island; 
@synthesize cay; 
@synthesize pit; 
@synthesize coordinatesW; 
@synthesize coordinatesN; 
@synthesize sex; 
@synthesize age; 

- (IBAction)retractKeyboard:(id)sender { 
    [self resignFirstResponder]; 
} 

- (IBAction)saveInfo:(id)sender { 
    NSString *resultLine=[NSString stringWithFormat:@"%@,%@,%@,%@,%@,%@,%@,%@,%@\n", 
          self.day.date, 
          self.species.text, 
          self.island.text, 
          self.cay.text, 
          self.pit.text, 
          self.coordinatesN.text, 
          self.coordinatesW.text, 
          self.sex.dataSource, 
          self.age.dataSource]; 
    NSString *docPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 

    //resultView.text = docPath;} 

    NSString *surveys=[docPath stringByAppendingPathComponent:@"results.csv"]; 

    if (![[NSFileManager defaultManager] fileExistsAtPath:surveys]) { 
     [[NSFileManager defaultManager] createFileAtPath:surveys contents:nil attributes:nil]; 
    } 
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:surveys]; 
    [fileHandle seekToEndOfFile]; 
    [fileHandle writeData:[resultLine dataUsingEncoding:NSUTF8StringEncoding]]; 
    [fileHandle closeFile]; 
    [email protected]""; 
    [email protected]""; 
    [email protected]""; 
    [email protected]""; 
    [email protected]""; 
    [email protected]""; 
    NSLog(@"info saved"); 
} 

- (IBAction)retrieveInfo:(id)sender { 
    NSString *docPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 
    //resultView.text = docPath; 
    NSString *surveys=[docPath stringByAppendingPathComponent:@"results.csv"]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath: surveys]) { 
     NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:surveys]; 
     NSString *surveyResults = [[NSString alloc]initWithData:[fileHandle availableData] encoding:NSUTF8StringEncoding]; 
     [fileHandle closeFile]; 
     self.resultView.text = surveyResults; 
    } 


} 



- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    //Initialize picker data 
    pickerDataSex = @[@"M",@"F",@"M/F"]; 
    pickerDataAge = @[@"Adu",@"Juv",@"Hat"]; 

    //Connect data to picker 
    self.sex.dataSource = self; 
    self.sex.delegate = self; 

    self.age.dataSource = self; 
    self.age.delegate = self; 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

//Number of columns of the data 
- (NSInteger)numberOfComponentsInPickerView: (UIPickerView *)pickerView 
{ 
    if (pickerView==self.sex){ 
     return 1; 
    } else if (pickerView==self.age){ 
     return 1; 
    } 

    return 0; 
} 

//Number of rows of data 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if (pickerView==self.sex){ 
     return pickerDataSex.count; 
    } else if (pickerView==self.age){ 
     return pickerDataAge.count; 
    } 
    return 0; 
} 

//The data to return for the row and component (column) that's being passed 
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    if (pickerView==self.sex){ 
     return pickerDataSex[row]; 
    } else if (pickerView==self.age){ 
     return pickerDataAge[row]; 
    } 
    return 0; 
} 

@end 

ответ

1

Вы можете получить значения из вашего UIPickerViews таким образом:

NSInteger selectedRowSex = [self.sex selectedRowInComponent:0]; 
NSInteger selectedRowAge = [self.age selectedRowInComponent:0]; 

NSString *selectedSex = [pickerDataSex objectAtIndex:selectedRowSex]; 
NSString *selectedAge = [pickerDataAge objectAtIndex:selectedRowAge]; 

Тогда

NSString *resultLine = [NSString stringWithFormat:@"%@,%@,%@,%@,%@,%@,%@,%@,%@\n", 
         self.day.date, 
         self.species.text, 
         self.island.text, 
         self.cay.text, 
         self.pit.text, 
         self.coordinatesN.text, 
         self.coordinatesW.text, 
         selectedSex, 
         selectedAge]; 
+0

Благодаря человеку. Это было потрясающе. Я исправил проблему. Я изучал использование делегатов, и я не мог понять этого. Теперь все работает отлично. – Cinghio

0

У вас есть код, заполняющий ваш выборщик, но не показал никакого кода, который получает выбранное значение из представления выбора.

Самый простой способ справиться с этим - это добавить код в свой метод saveInfo, который вызывает selectedRowInComponent в представлениях вашего выбора, чтобы получить текущее значение.

В качестве альтернативы вы можете реализовать метод делегатов pickerView:didSelectRow:inComponent и читать новое выбранное значение выбора каждый раз, когда оно изменяется.

Смежные вопросы