Click here to Skip to main content
15,878,809 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I am writing a mac application and in the menu there is a menu item 'Data Sets' which opens to list some data sets that will later change a custom view when selected but that doesn't matter at the moment. When one of the menu items is clicked, all items in the menu should be unchecked and the only one that should checked it the item that was clicked. For example if I click 'Rainfall Observation', 'Rainfall Observation' should be the only item that is checked. This is my code and it should select a single item but it doesn't:
Objective-C
@implementation AppDelegate

// Enum containing each data set name
enum {
    kDASHBRDtag = 0,
    kRAINOBStag,
    kVISIOBStag,
    kINFROBStag,
    kLIGHOBStag,
    kRAINFCStag,
    kTEMPFCStag,
    kCLOUFCStag,
    kPRESFCStag,
    kPRESCRTtag,
    kHOUROBStag,
    kRTXTFCStag,
    kTRIHFCStag,
    kDAIYFCStag,
    kMOUNFCStag,
    kREGEXTRtag,
    kCLMHISTtag,
    kCLMAVRGtag,
    kCLMANOMtag,
    kHISTOBStag,
    kMARNOBStag
};

// IBActions for each menu item - each one calls that checkDataSet: method with its respective data set from the enum above
- (IBAction)menuDASHBRD:(id)sender {
    [self checkDataSet:kDASHBRDtag];
}
- (IBAction)menuRAINOBS:(id)sender {
    [self checkDataSet:kRAINOBStag];
}
- (IBAction)menuVISIOBS:(id)sender {
    [self checkDataSet:kVISIOBStag];
}
- (IBAction)menuINFROBS:(id)sender {
    [self checkDataSet:kINFROBStag];
}
- (IBAction)menuLIGHOBS:(id)sender {
    [self checkDataSet:kLIGHOBStag];
}
- (IBAction)menuRAINFCS:(id)sender {
    [self checkDataSet:kRAINFCStag];
}
- (IBAction)menuTEMPFCS:(id)sender {
    [self checkDataSet:kTEMPFCStag];
}
- (IBAction)menuCLOUFCS:(id)sender {
    [self checkDataSet:kCLOUFCStag];
}
- (IBAction)menuPRESFCS:(id)sender {
    [self checkDataSet:kPRESFCStag];
}
- (IBAction)menuPRESCRT:(id)sender {
    [self checkDataSet:kPRESCRTtag];
}
- (IBAction)menuHOUROBS:(id)sender {
    [self checkDataSet:kHOUROBStag];
}
- (IBAction)menuRTXTFCS:(id)sender {
    [self checkDataSet:kRTXTFCStag];
}
- (IBAction)menuTRIHFCS:(id)sender {
    [self checkDataSet:kTRIHFCStag];
}
- (IBAction)menuDAIYFCS:(id)sender {
    [self checkDataSet:kDAIYFCStag];
}
- (IBAction)menuMOUNFCS:(id)sender {
    [self checkDataSet:kMOUNFCStag];
}
- (IBAction)menuREGEXTR:(id)sender {
    [self checkDataSet:kREGEXTRtag];
}
- (IBAction)menuCLMHIST:(id)sender {
    [self checkDataSet:kCLMHISTtag];
}
- (IBAction)menuCLMAVRG:(id)sender {
    [self checkDataSet:kCLMAVRGtag];
}
- (IBAction)menuCLMANOM:(id)sender {
    [self checkDataSet:kCLMANOMtag];
}
- (IBAction)menuHISTOBS:(id)sender {
    [self checkDataSet:kHISTOBStag];
}
- (IBAction)menuMARNOBS:(id)sender {
    [self checkDataSet:kMARNOBStag];
}

- (void)checkDataSet:(NSInteger)dataSet {
    // Uncheck all menu items in the menu
    [self.menuDASHBRD setState:NSOffState];
    [self.menuRAINOBS setState:NSOffState];
    [self.menuVISIOBS setState:NSOffState];
    [self.menuINFROBS setState:NSOffState];
    [self.menuLIGHOBS setState:NSOffState];
    [self.menuRAINFCS setState:NSOffState];
    [self.menuTEMPFCS setState:NSOffState];
    [self.menuCLOUFCS setState:NSOffState];
    [self.menuPRESFCS setState:NSOffState];
    [self.menuPRESCRT setState:NSOffState];
    [self.menuHOUROBS setState:NSOffState];
    [self.menuRTXTFCS setState:NSOffState];
    [self.menuTRIHFCS setState:NSOffState];
    [self.menuDAIYFCS setState:NSOffState];
    [self.menuMOUNFCS setState:NSOffState];
    [self.menuREGEXTR setState:NSOffState];
    [self.menuCLMHIST setState:NSOffState];
    [self.menuCLMAVRG setState:NSOffState];
    [self.menuCLMANOM setState:NSOffState];
    [self.menuHISTOBS setState:NSOffState];
    [self.menuMARNOBS setState:NSOffState];
    
    // Switch on the recieved data set from enum and check its respective menu item
    switch (dataSet) {
        case kDASHBRDtag: [self.menuDASHBRD setState:NSOnState]; break;
        case kRAINOBStag: [self.menuRAINOBS setState:NSOnState]; break;
        case kVISIOBStag: [self.menuVISIOBS setState:NSOnState]; break;
        case kINFROBStag: [self.menuINFROBS setState:NSOnState]; break;
        case kLIGHOBStag: [self.menuLIGHOBS setState:NSOnState]; break;
        case kRAINFCStag: [self.menuRAINFCS setState:NSOnState]; break;
        case kTEMPFCStag: [self.menuTEMPFCS setState:NSOnState]; break;
        case kCLOUFCStag: [self.menuCLOUFCS setState:NSOnState]; break;
        case kPRESFCStag: [self.menuPRESFCS setState:NSOnState]; break;
        case kPRESCRTtag: [self.menuPRESCRT setState:NSOnState]; break;
        case kHOUROBStag: [self.menuHOUROBS setState:NSOnState]; break;
        case kRTXTFCStag: [self.menuRTXTFCS setState:NSOnState]; break;
        case kTRIHFCStag: [self.menuTRIHFCS setState:NSOnState]; break;
        case kDAIYFCStag: [self.menuDAIYFCS setState:NSOnState]; break;
        case kMOUNFCStag: [self.menuMOUNFCS setState:NSOnState]; break;
        case kREGEXTRtag: [self.menuREGEXTR setState:NSOnState]; break;
        case kCLMHISTtag: [self.menuCLMHIST setState:NSOnState]; break;
        case kCLMAVRGtag: [self.menuCLMAVRG setState:NSOnState]; break;
        case kCLMANOMtag: [self.menuCLMANOM setState:NSOnState]; break;
        case kHISTOBStag: [self.menuHISTOBS setState:NSOnState]; break;
        case kMARNOBStag: [self.menuMARNOBS setState:NSOnState]; break;
    }
}

@end

I have been playing around with the code and one time I got an 'error' (not a breaking exception but a message in the log window) and the check state does not change and another time, all selected items remained checked. I don't know if this is a problem with my code or something else like the default behaviour of the items because I removed all code from one of the menu item IBActions and it still checked which shouldn't happen because I have not told it to check. I do not know what to do and I want only one item to be checked at any one time. Thanks.
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900