ios – Logic Issues on Recursive Alert Controller options


On my iOS app, there’s a tableView that displays names from a dictionary. That dictionary also contains ageGroup and gender for them. A user can tap multiple names, and then click Next. Here’s what I WANT to happen when you click next. The app is for sorting the selected names into hotel rooms, with a max of 4 per room. So, if there’s more than 4 people in one gender, it will show an alert controller with the title room 1 for that gender, and a list of all that gender’s names. Tapping one name adds them to the room, removes them from the alert controller, and it is repeated until the room is filled, and goes to the next room to finish up. If there are multiple genders, than it will go ahead and move to the 2nd gender after finishing up the first. Then it stores all the data for what room what gender, etc.

The code below is mostly fine. The biggest issue now is that it seems to be handling everything based off just when 4 people are selected, not regarding how many rooms are needed. If I have 4 men and 4 women selected on the list it works fine. I tap first name for men and it removes that name and shows me 3 left, until I get done and then goes to the women. If I only have 3 men, it throws everything off.

- (void)nextButtonTapped {
    if (self.selectedItems.count > 0) {
        // Separate males and females
        NSMutableArray<NSDictionary *> *males = [NSMutableArray array];
        NSMutableArray<NSDictionary *> *females = [NSMutableArray array];

        for (NSDictionary *selectedInfo in self.selectedItems) {
            if ([selectedInfo[@"gender"] isEqualToString:@"Male"]) {
                [males addObject:selectedInfo];
            } else if ([selectedInfo[@"gender"] isEqualToString:@"Female"]) {
                [females addObject:selectedInfo];
            }
        }

        // Handle males
        [self handleGenderSelectionForGender:@"Males" genderArray:males completion:^{
            // Handle females
            [self handleGenderSelectionForGender:@"Females" genderArray:females completion:^{
                // Display the selected items in the desired format
                [self displaySelectedItems];
            }];
        }];
    }
}

- (void)handleGenderSelectionForGender:(NSString *)gender genderArray:(NSMutableArray<NSDictionary *> *)genderArray completion:(void (^)(void))completion {
    NSInteger numberOfRooms = (genderArray.count + 3) / 4;
    
    // Check if it's the last room for males
    if ([gender isEqualToString:@"Males"] && numberOfRooms > 0) {
        // Handle males
        [self handleGenderSelectionRecursivelyForGender:gender genderArray:genderArray roomIndex:0 completion:^{
            // Move on to females after males are done
            [self handleGenderSelectionForGender:@"Females" genderArray:genderArray completion:completion];
        }];
    } else {
        // Handle females
        [self handleGenderSelectionRecursivelyForGender:gender genderArray:genderArray roomIndex:0 completion:completion];
    }
}

- (void)handleGenderSelectionRecursivelyForGender:(NSString *)gender genderArray:(NSMutableArray<NSDictionary *> *)genderArray roomIndex:(NSInteger)roomIndex completion:(void (^)(void))completion {
    if (roomIndex < (genderArray.count + 3) / 4) {
        [self presentRoomSelectionAlertForGender:gender genderArray:genderArray roomIndex:roomIndex completion:^{
            [self handleGenderSelectionRecursivelyForGender:gender genderArray:genderArray roomIndex:roomIndex + 1 completion:completion];
        }];
    } else {
        // All rooms are processed
        completion();
    }
}

- (void)displaySelectedItems {
    NSLog(@"Display %@", self.roomselectedItems);
    //IGNORING this method until after everything else is worked out
}
- (void)presentRoomSelectionAlertForGender:(NSString *)gender genderArray:(NSMutableArray<NSDictionary *> *)genderArray roomIndex:(NSInteger)roomIndex completion:(void (^)(void))completion {
    [self showNextAlertForGender:gender genderArray:genderArray roomIndex:roomIndex count:0 completion:completion];
}

- (void)showNextAlertForGender:(NSString *)gender genderArray:(NSMutableArray<NSDictionary *> *)genderArray roomIndex:(NSInteger)roomIndex count:(NSInteger)count completion:(void (^)(void))completion {
    NSString *title = [NSString stringWithFormat:@"%@: Room %@", gender, @(roomIndex + 1)];
    NSString *message = [NSString stringWithFormat:@"Choose up to 4 people for this room"];

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];

    __block NSInteger selectedCount = count;  // Track the number of selected names for the room

    // Create a copy of genderArray to iterate over
    NSArray<NSDictionary *> *genderArrayCopy = [genderArray copy];

    // Add actions for selecting names
    for (NSDictionary *selectedInfo in genderArrayCopy) {
        NSString *name = selectedInfo[@"name"];

        UIAlertAction *nameAction = [UIAlertAction actionWithTitle:name
                                                             style:UIAlertActionStyleDefault
                                                           handler:^(UIAlertAction * _Nonnull action) {
            // Handle the selection of a name for the room
            NSString *selectedName = action.title;
            NSLog(@"Selected Name: %@", selectedName);
            // Add logic to save the selected names for the room
            [self.roomselectedItems addObject:@{@"name": selectedName, @"gender": selectedInfo[@"gender"], @"ageGroup": selectedInfo[@"ageGroup"], @"roomIndex": @(roomIndex + 1)}];

            // Remove selected person from the original array
            [genderArray removeObject:selectedInfo];

            // Update the selected count
            selectedCount++;

            // Check if the required number of people for the room is reached
            if (selectedCount % 4 == 0 || selectedCount == genderArrayCopy.count) {
                // Move on to the next room if available
                NSInteger nextRoomIndex = roomIndex + 1;
                
                if (nextRoomIndex < (genderArray.count + 3) / 4) {
                    // Dismiss the current alert before showing the next one
                    [self dismissViewControllerAnimated:NO completion:^{
                        [self showNextAlertForGender:gender genderArray:genderArray roomIndex:nextRoomIndex count:count + 1 completion:completion];
                    }];
                } else {
                    // Dismiss the alert if the last room is reached
                    [self dismissViewControllerAnimated:YES completion:^{
                        completion(); // Call the completion handler when all rooms are processed
                    }];
                }
            } else {
                // Dismiss the current alert and show the next one
                [self dismissViewControllerAnimated:NO completion:^{
                    NSLog(@"Selected Items %@", self.roomselectedItems);

                    [self showNextAlertForGender:gender genderArray:genderArray roomIndex:roomIndex count:selectedCount completion:completion];
                }];
            }
        }];

        [alertController addAction:nameAction];
    }

    [self presentViewController:alertController animated:YES completion:nil];
}

Latest articles

spot_imgspot_img

Related articles

Leave a reply

Please enter your comment!
Please enter your name here

spot_imgspot_img