UIPickerView 空
Posted
技术标签:
【中文标题】UIPickerView 空【英文标题】:UIPickerView Empty 【发布时间】:2013-10-24 23:04:27 【问题描述】:我的问题仅在于我的选择器“proPicker”。奇怪的是,对象仍然在数组中,因为即使选择器显示为空白,我的文本字段中的文本也会发生变化......
我相信我已按照所有步骤填充选择器,并且 10 次选择器中有 9 次显示正确信息,但有时它只是显示为空白..
这是我的代码:
.h:
//
// EditDebateViewController.h
//
//
// Created by Jacob Klapper on 10/17/13.
//
//
#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
@interface EditDebateViewController : UITableViewController <UITextFieldDelegate, UIPickerViewDelegate,UIActionSheetDelegate>
@property UIDatePicker *pickerView;
@property (weak, nonatomic) IBOutlet UITextField *topic;
@property (weak, nonatomic) IBOutlet UITextField *pro;
@property (weak, nonatomic) IBOutlet UITextField *con;
@property (weak, nonatomic) IBOutlet UITextField *pVotes;
@property (weak, nonatomic) IBOutlet UITextField *cVotes;
@property (weak, nonatomic) IBOutlet UITextField *abs;
@property (weak, nonatomic) IBOutlet UITextField *date;
@property NSMutableArray *pChoices;
@property NSMutableArray *pStrings;
@property NSMutableArray *cChoices;
@property NSMutableArray *cStrings;
@property NSMutableArray *proTest;
@property UIPickerView *proPicker;
@property PFObject *obj;
@end
.m:
//
// EditDebateViewController.m
//
//
// Created by Jacob Klapper on 10/17/13.
//
//
#import "EditDebateViewController.h"
@interface EditDebateViewController ()
@end
@implementation EditDebateViewController
- (id)initWithStyle:(UITableViewStyle)style
self = [super initWithStyle:style];
if (self)
// Custom initialization
return self;
- (void)viewDidLoad
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
//self.date = [[UIDatePicker alloc]init];
self.date.delegate = self;
self.pro.delegate = self;
self.con.delegate = self;
self.pVotes.delegate = self;
self.cVotes.delegate = self;
self.abs.delegate = self;
self.topic.delegate = self;
self.pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 322, 0, 0)];
self.pickerView.datePickerMode = UIDatePickerModeDate;
self.pickerView.hidden = true;
self.pickerView.date = [NSDate date];
[self.pickerView addTarget:self
action:@selector(updateLabel:)
forControlEvents:UIControlEventValueChanged];
//[self.view addSubview:pickerToolbar];
[self.tableView addSubview:self.pickerView];
//self.pickerView.del
self.date.inputView = self.pickerView;
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:@"MMM dd, yyyy "];
self.proPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 322, 0, 0)];
self.proPicker.hidden = true;
self.proPicker.delegate = self;
[self.tableView addSubview:self.proPicker];
self.pro.inputView = self.proPicker;
self.pStrings = [[NSMutableArray alloc]init];
self.cStrings = [[NSMutableArray alloc]init];
self.pChoices = [[NSMutableArray alloc]initWithArray:[self.obj objectForKey:@"PR"]];
self.cChoices = [[NSMutableArray alloc]init];
self.proTest = [[NSMutableArray alloc]init];
//self.pChoices = [self.obj objectForKey:@"PR"];
//self.cChoices = [self.obj objectForKey:@"CR"];
NSLog(@"Choices Now: %@", self.pChoices);
NSLog(@"Choices Count: %lu", (unsigned long)[self.pChoices count]);
for (PFUser *us in self.pChoices)
//NSLog(@"Hi");
//PFUser *user = [self.pChoices objectAtIndex:i];
[us fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
//[self.pChoices addObject:object];
//NSString *name = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
//NSLog(name);
//[self.proTest addObject:object];
//NSLog(@"The value before pStrings is: %@", name);
//[self.pStrings addObject:name];
//NSLog(@"This is spot: %@", [self.pStrings objectAtIndex:i]);
[self.proTest addObject:object];
NSString *name = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
[self.pStrings addObject:name];
NSLog(@"Pro Test: %@", self.proTest);
NSLog(@"Pro Strings: %@", self.pStrings);
NSLog(@"User: %@", us);
NSLog(@"Object: %@", object);
];
NSLog(@"Strings: %@", self.pStrings);
NSLog(@"Pro Test: %lu", (unsigned long)[self.proTest count]);
//NSLog(@"%@", self.pStrings);
self.topic.text = [self.obj objectForKey:@"Topic"];
self.date.text = [df stringFromDate:[self.obj objectForKey:@"Date"]];
NSLog(@"Hi Test");
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ] isEqualToString:@"0"])
NSLog(@"ITS NULL");
self.pVotes.text = @"";
//self.pVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ];
else
self.pVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ];
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"conVotes"] ] isEqualToString:@"0"])
self.cVotes.text = @"";
else
self.cVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"conVotes"] ];
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"Abstentions"] ] isEqualToString:@"0"])
self.abs.text = @"";
else
self.abs.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"Abstentions"]];
/*
NSLog(@"Here");
NSLog(@"%@", proU);
self.pro.text = [NSString stringWithFormat:@"%@ %@", [proU objectForKey:@"firstName"], [proU objectForKey:@"lastName"]];
PFUser *conU = [self.obj objectForKey:@"Con"];
//self.con.text = [NSString stringWithFormat:@"%@ %@", [conU objectForKey:@"firstName"], [conU objectForKey:@"lastName"]];
*/
PFUser *proU = [self.obj objectForKey:@"Pro"];
[proU fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
self.pro.text = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
];
PFUser *conU = [self.obj objectForKey:@"Con"];
[conU fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
self.con.text = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
];
[self.pickerView setDate:[self.obj objectForKey:@"Date"]];
[self.proPicker reloadAllComponents];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
-(void)viewDidAppear:(BOOL)animated
[self.proPicker reloadAllComponents];
/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
// Return NO if you do not want the specified item to be editable.
return YES;
*/
/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
// Delete the row from the data source
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
else if (editingStyle == UITableViewCellEditingStyleInsert)
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
*/
/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
*/
/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
// Return NO if you do not want the item to be re-orderable.
return YES;
*/
/*
#pragma mark - Navigation
// In a story board-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
*/
- (IBAction)backcustom:(UIBarButtonItem *)sender
[self.navigationController popViewControllerAnimated:YES];
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
//[aTextField resignFirstResponder];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:@"MMM dd, yyyy "];
if(textField == self.topic)
NSLog(@"Topic");
if(textField == self.date)
self.pickerView.hidden = false;
self.date.text = [df stringFromDate:self.pickerView.date];
if(textField == self.pro)
self.proPicker.hidden = false;
//self.pro.text =
NSInteger rowSelectionKg = [self.proPicker selectedRowInComponent:0]; //get currrent row of picker for first column
NSString *tempKg = [self.pStrings objectAtIndex:rowSelectionKg]; //use row as index to get value in corresponding array of choices in picker
self.pro.text = tempKg;
//pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
return YES;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
if (pickerView == self.proPicker)
self.pro.text = [self.pStrings objectAtIndex:row];
else
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:@"MMM dd, yyyy "];
self.date.text = [df stringFromDate:self.pickerView.date];
//NSString *strFirstPickerView = [_ty objectAtIndex:row];
//_providerType.text = strFirstPickerView;
- (void)updateLabel:(id)sender
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:@"MMM dd, yyyy "];
self.date.text = [df stringFromDate:self.pickerView.date];
- (IBAction)saveChanges:(UIBarButtonItem *)sender
[self.obj setObject:self.topic.text forKey:@"Topic"];
[self.obj setObject:[NSNumber numberWithInt:self.pVotes.text.intValue] forKey:@"proVotes"];
[self.obj setObject:[NSNumber numberWithInt:self.cVotes.text.intValue] forKey:@"conVotes"];
[self.obj setObject:[NSNumber numberWithInt:self.abs.text.intValue] forKey:@"Abstentions"];
[self.obj setObject:self.pickerView.date forKey:@"Date"];
NSLog(@"Saving...");
[self.obj saveInBackground];
[self performSegueWithIdentifier:@"afterSave" sender:self];
//[self.navigationController popViewControllerAnimated:YES];
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"Section: %ld", (long)[indexPath section]);
NSLog(@"Row: %ld", (long)[indexPath row]);
if([indexPath section] == 1 && [indexPath row] == 0)
NSLog(@"Right Cell");
UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete Debate" otherButtonTitles:nil];
popupQuery.tag = 1;
[popupQuery showInView:self.view];
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
if(actionSheet.tag == 1)
if(buttonIndex == 0)
[self.obj deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
[self performSegueWithIdentifier:@"afterSave" sender:self];
//[self loadObjects];
];
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
if(pickerView == self.proPicker)
NSLog(@"First Log");
NSLog(@"In numComponents: %@",self.pStrings);
return 1;
return 1;
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
if(pickerView == self.proPicker)
NSLog(@"Right Picker");
NSLog(@"Count in numRows: %lu", (unsigned long)[self.pStrings count]);
return [self.pStrings count];
//return [_ty count];
return [self.pStrings count];
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
if(pickerView == self.proPicker)
NSLog(@"Picked goooood");
return [self.pStrings objectAtIndex:row];
return [self.pStrings objectAtIndex:row];
@end
【问题讨论】:
我不明白这个[self.tableView addSubview:self.pickerView];
这是我的另一个选择器,该行将其添加到视图中...我的问题在于我的选择器“proPicker”
【参考方案1】:
fetchIfNeededInBackgroundWithBlock
调用是异步的。
这一行:
[self.pStrings addObject:name];
将数据填入self.pStrings。
您希望在您拨打此电话时填写其值:
[self.proPicker reloadAllComponents];
在 viewDidLoad 方法的末尾。在加载该数据之前,您无需重新加载AllComponents。
如果您已经重新加载了组件,我建议您添加一个 BOOL 来跟踪。如果有,只需在获取数据结束时再次执行此操作。像这样:
- (void)viewDidLoad
[super viewDidLoad];
__block BOOL hasCompletedSetup = NO;
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
//self.date = [[UIDatePicker alloc]init];
self.date.delegate = self;
self.pro.delegate = self;
self.con.delegate = self;
self.pVotes.delegate = self;
self.cVotes.delegate = self;
self.abs.delegate = self;
self.topic.delegate = self;
self.pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 322, 0, 0)];
self.pickerView.datePickerMode = UIDatePickerModeDate;
self.pickerView.hidden = true;
self.pickerView.date = [NSDate date];
[self.pickerView addTarget:self
action:@selector(updateLabel:)
forControlEvents:UIControlEventValueChanged];
//[self.view addSubview:pickerToolbar];
[self.tableView addSubview:self.pickerView];
//self.pickerView.del
self.date.inputView = self.pickerView;
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:@"MMM dd, yyyy "];
self.proPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 322, 0, 0)];
self.proPicker.hidden = true;
self.proPicker.delegate = self;
[self.tableView addSubview:self.proPicker];
self.pro.inputView = self.proPicker;
self.pStrings = [[NSMutableArray alloc]init];
self.cStrings = [[NSMutableArray alloc]init];
self.pChoices = [[NSMutableArray alloc]initWithArray:[self.obj objectForKey:@"PR"]];
self.cChoices = [[NSMutableArray alloc]init];
self.proTest = [[NSMutableArray alloc]init];
//self.pChoices = [self.obj objectForKey:@"PR"];
//self.cChoices = [self.obj objectForKey:@"CR"];
NSLog(@"Choices Now: %@", self.pChoices);
NSLog(@"Choices Count: %lu", (unsigned long)[self.pChoices count]);
for (PFUser *us in self.pChoices)
//NSLog(@"Hi");
//PFUser *user = [self.pChoices objectAtIndex:i];
[us fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
//[self.pChoices addObject:object];
//NSString *name = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
//NSLog(name);
//[self.proTest addObject:object];
//NSLog(@"The value before pStrings is: %@", name);
//[self.pStrings addObject:name];
//NSLog(@"This is spot: %@", [self.pStrings objectAtIndex:i]);
[self.proTest addObject:object];
NSString *name = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
[self.pStrings addObject:name];
NSLog(@"Pro Test: %@", self.proTest);
NSLog(@"Pro Strings: %@", self.pStrings);
NSLog(@"User: %@", us);
NSLog(@"Object: %@", object);
];
if (hasCompletedSetup)
[self.proPicker reloadAllComponents];
NSLog(@"Strings: %@", self.pStrings);
NSLog(@"Pro Test: %lu", (unsigned long)[self.proTest count]);
//NSLog(@"%@", self.pStrings);
self.topic.text = [self.obj objectForKey:@"Topic"];
self.date.text = [df stringFromDate:[self.obj objectForKey:@"Date"]];
NSLog(@"Hi Test");
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ] isEqualToString:@"0"])
NSLog(@"ITS NULL");
self.pVotes.text = @"";
//self.pVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ];
else
self.pVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"proVotes"] ];
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"conVotes"] ] isEqualToString:@"0"])
self.cVotes.text = @"";
else
self.cVotes.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"conVotes"] ];
if([[NSString stringWithFormat:@"%@", [self.obj objectForKey:@"Abstentions"] ] isEqualToString:@"0"])
self.abs.text = @"";
else
self.abs.text = [NSString stringWithFormat:@"%@", [self.obj objectForKey:@"Abstentions"]];
/*
NSLog(@"Here");
NSLog(@"%@", proU);
self.pro.text = [NSString stringWithFormat:@"%@ %@", [proU objectForKey:@"firstName"], [proU objectForKey:@"lastName"]];
PFUser *conU = [self.obj objectForKey:@"Con"];
//self.con.text = [NSString stringWithFormat:@"%@ %@", [conU objectForKey:@"firstName"], [conU objectForKey:@"lastName"]];
*/
PFUser *proU = [self.obj objectForKey:@"Pro"];
[proU fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
self.pro.text = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
];
PFUser *conU = [self.obj objectForKey:@"Con"];
[conU fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error)
self.con.text = [NSString stringWithFormat:@"%@ %@", [object objectForKey:@"firstName"], [object objectForKey:@"lastName"]];
];
[self.pickerView setDate:[self.obj objectForKey:@"Date"]];
hasCompletedSetup = YES;
[self.proPicker reloadAllComponents];
【讨论】:
但这如何导致选择器在 10 次中仅显示 1 次为空?那么它只是随机的吗? 通常会及时完成,但有时不会。这是在后台运行的异步任务的症状,并且只要感觉像就做事。如果您的手机正忙于做其他事情,它会拒绝您对数据的请求,直到您想这样做为止。有点像青少年,或 android 设备。 我刚刚尝试了您的建议,但我的选择器仍然显示为空……第一次尝试! :(还有其他想法吗?这真的很奇怪...... 没有想法。哇!这很奇怪。 其他人有什么想法吗?这真的很奇怪,我需要修复它才能让我的应用程序在那里......以上是关于UIPickerView 空的主要内容,如果未能解决你的问题,请参考以下文章
UIPickerView didSelectRow 之后的空变量