Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature request - PickerView close/collapse on tap #8

Open
code-K opened this issue Mar 9, 2015 · 1 comment
Open

Feature request - PickerView close/collapse on tap #8

code-K opened this issue Mar 9, 2015 · 1 comment

Comments

@code-K
Copy link

code-K commented Mar 9, 2015

Hi there, please implement a possibility to easily "close/collapse" an picker element when selecting another picker element or even click anywhere else in the view.

Because currently when selecting "one" picker element and it's shown, and then select a "second" picker element, both are left open/visible and this takes much of screen size.

@code-K
Copy link
Author

code-K commented Mar 9, 2015

hi @atomkirk

I've implemented it now by myself. It's maybe not the best way but is working!

Here's how:

  1. I needed to set the "elements" accessible in "MYSFormViewController.h" :
@property (nonatomic, strong) NSMutableArray      *elements;
  1. I needed to set the "visible" bool accessible in "MYSFormDatePickerElement.h" and "MYSFormPickerElement.h" (so i removed the 'readonly') :
@property (nonatomic, assign, getter = isVisible) BOOL visible;
  1. I add a NotificationCenter post in "formDatePickerCellRequestedDatePicker" and "formPickerCellRequestedPicker" of "MYSFormDatePickerElement.m" and "MYSFormPickerElement.m" :

MYSFormDatePickerElement.m

- (void)formDatePickerCellRequestedDatePicker:(MYSFormDatePickerCell *)cell
{
    id value = [self.dataSource modelValueForFormElement:self];
    self.datePicker.date = value ?: [NSDate date];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pickerTapped" object:self];

    if (!self.isVisible) {
        self.visible = YES;
        [self.delegate formElement:self didRequestPresentationOfChildView:self.datePicker];
    }
    else {
        self.visible = NO;
        [self.delegate formElement:self didRequestDismissalOfChildView:self.datePicker];
    }
}

MYSFormPickerElement.m

- (void)formPickerCellRequestedPicker:(MYSFormPickerCell *)cell
{
    id value = [self.dataSource modelValueForFormElement:self];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pickerTapped" object:self];

    NSInteger index = [self.data indexOfObject:value];
    if (index != NSNotFound) {
        [self.pickerView selectRow:index inComponent:0 animated:YES];
    }
    if (!self.isVisible) {
        self.visible = YES;
        [self.delegate formElement:self didRequestPresentationOfChildView:self.pickerView];
    }
    else {
        self.visible = NO;
        [self.delegate formElement:self didRequestDismissalOfChildView:self.pickerView];
    }
}
  1. Lastly in my Controller add observer + method (This is SWIFT on my end) :
override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.collectionView?.reloadData()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "pickerTapped:", name: "pickerTapped", object: nil)
    }
func pickerTapped(picker: AnyObject){
        //
        //println("pickerTapped")
        //println(picker)

        //loop through elements and check if it's picker? Then set all other pickers visible to false
        for element in self.elements {
            //println(element)

            if (element.isKindOfClass(MYSFormDatePickerElement))
            {
                //println("is MYSFormDatePickerElement")

                if picker.object as? MYSFormDatePickerElement != nil && picker.object as? MYSFormDatePickerElement != element as? MYSFormDatePickerElement {
                    //println(" PICKER IS MYSFormDatePickerElement")

                    //println("is not requested picker")
                    var newElement = element as MYSFormDatePickerElement
                    if newElement.visible == true
                    {
                        newElement.visible = false
                        newElement.delegate.formElement(newElement, didRequestDismissalOfChildView: newElement.datePicker)
                    }

                }

            }else if (element.isKindOfClass(MYSFormPickerElement))
            {
                //println("is MYSFormPickerElement")

                if picker.object as? MYSFormPickerElement != nil && picker.object as? MYSFormPickerElement != element as? MYSFormPickerElement {
                    //println(" PICKER IS MYSFormPickerElement")
                    //println("is not requested picker")
                    var newElement = element as MYSFormPickerElement
                    if newElement.visible == true
                    {
                        newElement.visible = false
                        newElement.delegate.formElement(newElement, didRequestDismissalOfChildView: newElement.pickerView)
                    }
                }

            }

        }
    }

This seems to work just fine... Please let me know if you'll implement a better solution...

Thanks so much and best regards,
C

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant