Search code examples
iosobjective-cnsarrayuipickerview

Start off UIPickerView With Blank Row


My app pulls data from a server to get a list of current groups available to choose from. It then adds a row to the top of this called "Create New Group". This works great, but it starts off already selecting this row, so I have to navigate away from it, and then back again to select it and activate the keyboard. How can I add one more option to get it to start with a blank row? I have tried simply doing + 2 in the rows instead of + 1, and sorting everything down, but it simply doesn't work. Any help greatly appreciated.

-(NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component{
    return [pickerArray count] + 1;
}

#pragma mark- Picker View Delegate

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component{
    if (row == 0)
    {
        [self.theView.signUpView.additionalField resignFirstResponder];
        self.theView.signUpView.additionalField.inputView = nil;
        [self.theView.signUpView.additionalField becomeFirstResponder];

    }
    else {

    [self.theView.signUpView.additionalField setText:self.theGroup];
    }
}
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSString *groupName  = @"Create New Group";
    if (row != 0)
    {
        PFObject *object = pickerArray[row - 1]; // -1 to handle the array index
        self.theGroup    = object[@"GroupName"];
        groupName        = object[@"GroupName"];
    }
    return groupName;
}

Solution

  • This approach adjusts your array by two, allowing for the blank space you requested. I also introduced switch statements to make it a bit easier to understand what is happening. Comments were added in code to highlight changes relevant to your request.

    #pragma mark- Picker View Delegate
    
    -(NSInteger)pickerView:(UIPickerView *)pickerView
    numberOfRowsInComponent:(NSInteger)component{
        return [pickerArray count] + 2; // This offsets your blank line & "Create new group" option
    }
    
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
        return 1;
    }
    
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:
    (NSInteger)row inComponent:(NSInteger)component{
        switch (row) {
                // Ignore 0 here since you don't want to handle the blank space
                case 1:
                [self.theView.signUpView.additionalField resignFirstResponder];
                self.theView.signUpView.additionalField.inputView = nil;
                [self.theView.signUpView.additionalField becomeFirstResponder];
                break;
            default:
                [self.theView.signUpView.additionalField setText:self.theGroup];
        }
    }
    - (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        switch (row) {
                case 0:
                return @"";
                case 1:
                return @"Create New Group";
            default:
                PFObject *object = pickerArray[row - 2];
                self.theGroup    = object[@"GroupName"];
                return self.theGroup;
        }
    }
    

    I included the image below to show what this looks like when using some generic data.

    enter image description here