1

I have a textfield in my form sheet. When the textfield is typed on, I want a popover to appear with a pickerView inside. I've used popOverController before, but in this case I don't have a clue on how to place a pickerView and set it's delegate and datasource to the form sheet view controller, because actually the popover needs an independent view controller.

i tried the following (the app is universal), the popover isn't appearing:

- (IBAction)gradeTextfieldPressed:(UITextField *)sender
{

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {

        [self.nameTextField resignFirstResponder];
        UIViewController *pickerController = [[UIViewController alloc] init];
        UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(self.gradeTextField.center.x, self.gradeTextField.center.y, 320, 320)];
        pickerView.delegate = self;
        pickerView.dataSource = self;
        [pickerController.view addSubview:pickerView];
        UIPopoverController *pickerPopover = [[UIPopoverController alloc] initWithContentViewController:pickerController];
        [pickerPopover presentPopoverFromRect:CGRectMake(self.gradeTextField.center.x, self.gradeTextField.center.y, 320, 320) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        [self.gradeTextField setInputView:pickerView];
        if ([self.gradeTextField.text isEqualToString:@""]) {
            [self pickerView:pickerView didSelectRow:0 inComponent:0];
        }

    } else if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        [self.picker setHidden:NO];
        //[self pickerView:self.picker didSelectRow:0 inComponent:0];
        if ([self.gradeTextField.text isEqualToString:@""]) {
            [self pickerView:self.picker didSelectRow:0 inComponent:0];
        }
        [self.gradeTextField setInputView:self.picker];
        [self.nameTextField resignFirstResponder];
        [self.creditstextField resignFirstResponder];
        [self.chaptersTextField resignFirstResponder];
    }    
}
HusseinB
  • 1,321
  • 1
  • 17
  • 41

1 Answers1

0

One way to do this that I found simple Create a new controller with just the PickerView in it (in this case done with a .xib), and have a simple delegate protocol to let your form sheet controller know when something has been picked.

@protocol MyPickerDelegate <NSObject>
- (void)valuePicked:(NSString*)value
@end

@interface MyPickerController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>
{
    __weak IBOutlet UIPickerView *_pickerView;
}
@property (nonatomic, weak) id<MyPickerDelegate> delegate;

You can then implement the data source and delegate methods in this controller. Here would be the code for when the item was picked:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    [_delegate valuePicked:[_myStrings objectAtIndex:row]];
}

And finally, in the calling class (your form sheet controller):

- (void)displayPickerFromRect:(CGRect)rect inView:(UIView*)view
{
    if (!_pickerController)
        _pickerController = [[MyPickerController alloc] initWithNibName:nil bundle:nil];

    if (_pickerController)
    {
        _speedPickerController.delegate = self;

        if (!_pickerPopover)
        {
            _pickerPopover = [[UIPopoverController alloc] initWithContentViewController:_pickerController];
            _pickerPopover.popoverContentSize = _pickerController.view.frame.size;
            _pickerPopover.delegate = self;
        }

        [_pickerPopover presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    if (_pickerController)
    {
        _pickerController = nil;
        _pickerPopover = nil;
    }
}

- (void)valuePicked:(NSString*)value
{
   // do something with the picked value
   // dismiss the popover if you want it to go away as soon as a value is picked
}
cdemiris99
  • 597
  • 4
  • 6