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 并添加 UIToolbar

UIPickerView 空

UIPickerView didSelectRow 之后的空变量

如果我在选择器旋转时使用完成按钮关闭 UIPickerview 的操作表,则获取空值

如何解决uipickerview

将更新的数组数据传递给 uipickerview