views:

58

answers:

1

Hi,

I am writing a google reader application and have been trying to create the settings table view with UISwitch. Below is the complete code sequence:

@implementation Settings
@synthesize rowImage;
@synthesize ViewPushed;
@synthesize alreadySignedIn;
@synthesize syncStartupSwitch;
@synthesize confirmMarkSwitch;
@synthesize landscapeModeSwitch;
@synthesize appBadgeSwitch;
@synthesize fontSwitch;
@synthesize newItemsSwitch;

#pragma mark -
#pragma mark View lifecycle
static SEL syncStartup;
static SEL markAsReadConfirm;
static SEL landscapeMode;
static SEL appBadge;
static SEL fontSettings;
static SEL newItemsFirstSel;

+(void) initialize{
    syncStartup = @selector(syncAtStartup:);
    markAsReadConfirm = @selector (confirmMarkAsRead:);
    landscapeMode = @selector (landscapeMode:);
    appBadge = @selector (appBadgeSetting:);
    fontSettings = @selector (largeFontSetting:);
    newItemsFirstSel = @selector (newItemFirst:);


}

-(void) newItemFirst:(id)sender {
    if ([sender isOn]) {
        newItemsSwitch = YES;
    }else {
        newItemsSwitch = NO;
    }

}
-(void) syncAtStartup:(id)sender {
    if ([sender isOn]) {
        syncStartupSwitch = YES;

    }else {
        syncStartupSwitch = NO;

    }
}

-(void) confirmMarkAsRead:(id)sender{
    if ([sender isOn]) {
        confirmMarkSwitch = YES;

    }else {
        confirmMarkSwitch = NO;
        [self.tableView reloadData];
    }
}

-(void) landscapeMode:(id)sender{
    if([sender isOn]) {
        landscapeModeSwitch = YES;

    }else {
        landscapeModeSwitch = NO;
    }
}

-(void) appBadgeSetting:(id)sender{
    if([sender isOn]) {
        appBadgeSwitch = YES;

    }else {
        appBadgeSwitch = NO;
    }

}

-(void) largeFontSetting:(id)sender{
    if ([sender isOn]) {
        [UIFont systemFontOfSize:32];
        fontSwitch = YES;
        NSLog(@"YES");
    }else {
        fontSwitch = NO;
        NSLog(@"YES");
    }

}
/*
-(void) saveLastViewedItem{
    [plistData setValue:[[[UIApplication sharedApplication]delegate]currentItemID]forKey:keyLastItemID];
    [plistData setValue:[[[[[[[UIApplication sharedApplication]delegate]navController]navController]topViewController]delegate]tag]forKey:keyLastItemTag];
}

-(void) save {
    [self saveLastViewedItem];
    BOOL success = [plistData writeToFile:[docsPath stringByAppendingPathComponent:plistName] atomically:YES];
    if (!success) {
        NSLog(@"FAILED saving plist");
    }else {
        dbg_s(@"saved data:%@ to file: %@", plistData, [docsPath stringByAppendingPathComponent:plistName]);

        }

}
-(void) load{
    dbg(@"loading plist data from path: %@", [docsPath stringByAppendingPathComponent:plistName]);
    plistData = [[NSMutableDictionary dictionaryWithContentsOfFile:[docsPath stringByAppendingPathComponent:plistName]]retain];
        if(!plistData){
            NSLog(@"FAILED loading plist");
            plistData = [[NSMutableDictionary dictionary] retain];
        }
    dbg_s(@"Loaded plist data", plistData);
    dbg_s("%@", plistData);
    [self removeDeprecatedProperties];
    [self loadFeedList];
}

-(void) removeDeprecatedProperties{
    for (NSString * deprecatedProperty in deprecatedProperties){
        [plistData removeObjectForKey:deprecatedProperty];
    }
}

-(void) reloadFeedList{
    [self loadFeedList];
    [self setUIElements];
}

-(NSArray *) loadFeedList {
    NSString *contents = [NSString stringWithContentsOfFile:[docsPath stringByAppendingPathComponent:@"tagList"]encoding:NSUTF8StringEncoding error:nil];
    id result;
    if(!contents) {
        dbg(@"no feed list loaded");
        result = nil;
    }else {
        NSArray *originalList = [contents componentsSeparatedByString:@"\n"];
        NSMutableArray *feedList = [NSMutableArray arrayWithCapacity:[originalList count]];
        for (NSString *feed in originalList) {
            NSString *trimmedFeed = [feed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            if([feed length] > 0){
                [feedList addObject:trimmedFeed];
            }
        }
        result = feedList;
    }
    [possibleTags release];
    possibleTags = [result retain];
    return result;
}

-(NSArray *)feedList {
    return possibleTags;
}

-(NSArray *) activeTagList {
    id tags = [self tagList];
    NSArray *result = [NSMutableArray arrayWithCapacity:[tags count]];
    for (NSString *tag in tags) {
        if([possibleTags containsObject:tag]) {
            [result arrayByAddingObject:tag];
        }
    }
    return result;
}

-(id) init{
    self =[super init];
    plistName = @"config.plist";
    if (openLinksInSegmentValues == nil)
        openLinksInSegmentValues = [[NSArray alloc] initWithObjects:openLinksInAskMeValue, openLinksInSafariValue, openLinksIniReaderValue, nil];

    if (deprecatedProperties == nil) 
        deprecatedProperties = [[NSArray alloc] initWithObjects:@"openInSafari", nil];

    [self docsPath];
    [self load];
    return self;
}
*/

- (void)viewDidLoad {

    syncSwitch=[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    readSwitch=[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    landscapeSwitch=[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    badgeSwitch=[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    largeFontSwitch=[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    newItemsFirstSwitch =[[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];


        //switcher = [[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
    NSString *loginData;
    NSError *keychainError;
    NSString *checkUsername= [SFHFKeychainUtils getPasswordForUsername:@"Username" andServiceName:@"iReader" error:&keychainError];
    NSString *checkPassword = [SFHFKeychainUtils getPasswordForUsername:@"Password" andServiceName:@"iReader" error:&keychainError];

    if (checkPassword == nil || checkUsername == nil) {
        alreadySignedIn = NO;
        loginData = @"Sync Settings";

    } else {
        alreadySignedIn = YES;
        loginData = @"Logout";
    }


    if(ViewPushed == NO) {

        self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] 
                                                  initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
                                                  target:self action:@selector(cancel_Clicked:)] autorelease];


    }
    listOfItems = [[NSMutableArray alloc] init];
    NSArray *syncSettingsToLoad = [NSArray arrayWithObjects:loginData, nil];
    NSDictionary *syncSettingsToLoadDict = [NSDictionary dictionaryWithObject:syncSettingsToLoad forKey:@"Settings"];

    NSArray *generalSetting = nil;
    generalSetting = [NSArray arrayWithObjects:@"Sync at Startup",@"Confirm Mark as Read", @"Landscape Mode", @"Cache Settings",nil];
    NSMutableDictionary *generalSettingsDict = [NSMutableDictionary dictionaryWithObject:generalSetting forKey:@"Settings"];

    NSArray *appearanceSettings = [NSArray arrayWithObjects:@"New Items First", @"App Icon Badge", @"Large Font", nil];
    NSDictionary *appearanceSettingsDict = [NSDictionary dictionaryWithObject:appearanceSettings forKey:@"Settings"];

    NSArray *sharingSettings = [NSArray arrayWithObjects:@"Customize Sharing Options", nil];
    NSDictionary *sharingSettingsDict = [NSDictionary dictionaryWithObject:sharingSettings forKey:@"Settings"];

    NSArray *advancedSettings = [NSArray arrayWithObjects:@"Advanced Options", nil];
    NSDictionary *advancedSettingsDict = [NSDictionary dictionaryWithObject:advancedSettings forKey:@"Settings"];

    [listOfItems addObject:syncSettingsToLoadDict];
    [listOfItems addObject:generalSettingsDict];
    [listOfItems addObject:appearanceSettingsDict];
    [listOfItems addObject:sharingSettingsDict];
    [listOfItems addObject:advancedSettingsDict];
    self.title =@"Settings";


        // Uncomment the following line to preserve selection between presentations.
        //self.clearsSelectionOnViewWillAppear = NO;

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    [super viewDidLoad];
}

    //defaultDatabase = [[userPrefs valueForKey:MAPref_DefaultDatabase] retain];
-(void) cancel_Clicked:(id)sender 
{
    [self.navigationController dismissModalViewControllerAnimated:YES];
}


- (void)viewWillAppear:(BOOL)animated {
        //[self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}

/*
 - (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 }
 */
/*
 - (void)viewWillDisappear:(BOOL)animated {
 [super viewWillDisappear:animated];
 }
 */
/*
 - (void)viewDidDisappear:(BOOL)animated {
 [super viewDidDisappear:animated];
 }
 */
/*
 // Override to allow orientations other than the default portrait orientation.
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Return YES for supported orientations
 return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }
 */


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
    return [listOfItems count];

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
    NSDictionary *dictionary = [listOfItems objectAtIndex:section];
    NSArray *array = [dictionary objectForKey:@"Settings"];
    return [array count];

}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:
(NSInteger) section {
    if (section == 0) {
        return @"Sync Settings";
    }
    if (section == 1) {
        return @"General Options";
    }
    if (section == 2) {
        return @"Appearance Options";
    }
    if (section == 3){
        return @"Sharing Options";
    }
    if (section == 4){
        return @"Advanced Options";
    }
    return nil;
}

    // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        //NSLog(@"This is what we are looking for %@    %@", checkUsername, checkPassword);
        // Configure the cell...
    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSArray *array =[dictionary objectForKey:@"Settings"];
    NSString * cellValue = [array objectAtIndex:indexPath.row];

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (indexPath.section == 0 && indexPath.row == 0) {
        static NSString *SomeIdentifierA = @"SomeIdentifierA";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierA];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierA] autorelease];

            cell.accessoryType = UITableViewCellSelectionStyleBlue;


        }
        cell.textLabel.text =cellValue;
        return cell;
    }
    else if (indexPath.section ==1 && indexPath.row ==0) {
        static NSString *SomeIdentifierB = @"SomeIdentifierB";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierB];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierB] autorelease];
            [syncSwitch addTarget:self action:@selector(syncAtStartup:) forControlEvents:UIControlEventValueChanged];
                //[cell.contentView addSubview:syncSwitch];
            cell.accessoryView = syncSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
                //cell.reuseIdentifier  = @"Cell1";
        }
        cell.textLabel.text =@"Sync at Startup";
        return cell;
    }
    else if(indexPath.section == 1 && indexPath.row == 1){
        static NSString *SomeIdentifierC = @"SomeIdentifierC";
            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierC];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierC] autorelease];
            [readSwitch addTarget:self action:@selector(confirmMarkAsRead:) forControlEvents:UIControlEventValueChanged];
            cell.accessoryView = readSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
        cell.textLabel.text =@"Confirm Mark as Read";
        return cell;
    }
    else if(indexPath.section == 1 && indexPath.row == 2){
        static NSString *SomeIdentifierD = @"SomeIdentifierD";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierD];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierD] autorelease];
            [landscapeSwitch addTarget:self action:@selector(landscapeMode:) forControlEvents:UIControlEventValueChanged];
            cell.accessoryView = landscapeSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;

        }
        cell.textLabel.text =@"Landscape Mode";
        return cell;
    }
    else if (indexPath.section == 1 && indexPath.row == 3) {
        static NSString *SomeIdentifierE = @"SomeIdentifierE";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierE];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierE] autorelease];
            cell.accessoryType = UITableViewCellSelectionStyleBlue;
        }
        cell.textLabel.text =@"Cache Settings";
        return cell;
    }
    else if (indexPath.section == 1 && indexPath.row == 4) {
        static NSString *SomeIdentifierJ = @"SomeIdentifierJ";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierJ];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierJ] autorelease];
            cell.accessoryType = UITableViewCellSelectionStyleBlue;
        }
        cell.textLabel.text =@"Caches";
        return cell;
    }
    else if(indexPath.section == 2 && indexPath.row == 0){
        static NSString *SomeIdentifierN = @"SomeIdentifierF";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierN];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierN] autorelease];
            [newItemsFirstSwitch addTarget:self action:@selector(newItemFirst:) forControlEvents:UIControlEventValueChanged];
            cell.accessoryView = newItemsFirstSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
            cell.textLabel.text =@"App Icon Badge";
            return cell;
        }


        else if(indexPath.section == 2 && indexPath.row == 1){
        static NSString *SomeIdentifierF = @"SomeIdentifierF";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierF];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierF] autorelease];
            [badgeSwitch addTarget:self action:@selector(appBadgeSetting:) forControlEvents:UIControlEventValueChanged];
            cell.accessoryView = badgeSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
            cell.textLabel.text =@"App Icon Badge";
            return cell;
        }

        else if(indexPath.section == 2 && indexPath.row == 2){
            static NSString *SomeIdentifierG = @"SomeIdentifierG";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierG];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierG] autorelease];
            [largeFontSwitch addTarget:self action:@selector (largeFontSetting:) forControlEvents:UIControlEventValueChanged];
            //[largeFontSwitch addTarget:self action:@selector(largeFontSetting:) forControlEvents:UIControlEventValueChanged];
            cell.accessoryView = largeFontSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
            cell.textLabel.text =@"Large Font Size";
            return cell;
        }
        else if (indexPath.section == 3 && indexPath.row == 0) {
            static NSString *SomeIdentifierH = @"SomeIdentifierH";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierH];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierH] autorelease];
            cell.accessoryType = UITableViewCellSelectionStyleBlue;
        }
            cell.textLabel.text =@"Customize Sharing Options";
            return cell;
        }
        else if (indexPath.section == 4 && indexPath.row == 0) {
            static NSString *SomeIdentifierI = @"SomeIdentifierI";

            // This could be some custom table cell class if appropriate    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SomeIdentifierI];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierI] autorelease];
            cell.accessoryType = UITableViewCellSelectionStyleBlue;
        }
            cell.textLabel.text =@"Advanced Options";
            return cell;
        }
        //switcher.on = [[NSUserDefaults standardUserDefaults]boolForKey:@"Settings"];

        cell.textLabel.font = [UIFont boldSystemFontOfSize:13];
        cell.textLabel.adjustsFontSizeToFitWidth = YES;

        return cell;
}
/*
 // Override to support conditional editing of the table view.
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the specified item to be editable.
 return YES;
 }
 */


/*
 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

 if (editingStyle == UITableViewCellEditingStyleDelete) {
 // Delete the row from the data source
 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 }   
 else if (editingStyle == UITableViewCellEditingStyleInsert) {
 // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
 }   
 }
 */


/*
 // Override to support rearranging the table view.
 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
 }
 */


/*
 // Override to support conditional rearranging of the table view.
 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the item to be re-orderable.
 return YES;
 }
 */


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.section ==0){
        if (alreadySignedIn == NO) {
            if(indexPath.section == 0 && ivControllerCell == nil  ){
                [tableView reloadData];
                ivControllerCell = [[GoogleClientLogin alloc] initWithNibName:@"GoogleClientLogin" bundle:[NSBundle mainBundle]];
                ivControllerCell.ViewPushed = YES;

                    //Push the view controller to the top of the stack.
                [self.navigationController pushViewController:ivControllerCell  animated:YES];
                [ivControllerCell release];
                ivControllerCell = nil;
            }
        }

        if (alreadySignedIn ==YES) {
            NSError *keyChainEmpty;
            [SFHFKeychainUtils deleteItemForUsername:@"Username" andServiceName:@"iReader" error:&keyChainEmpty];
            [SFHFKeychainUtils deleteItemForUsername:@"Password" andServiceName:@"iReader" error:&keyChainEmpty];

            ivControllerCell = [[GoogleClientLogin alloc] initWithNibName:@"GoogleClientLogin" bundle:[NSBundle mainBundle]];

            ivControllerCell.ViewPushed = YES;
            [self.navigationController pushViewController:ivControllerCell animated:YES];

        }
    }

}




-(void) removeSelfFromWindow
{/* 



  if(self.view.superview){


  [UIView beginAnimations:@"curldown" context:nil];
  [UIView setAnimationDelegate:self];
  [UIView setAnimationDuration:0.5];
  [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
  [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:NO];
  [self.view.superview removeFromSuperview];


  }
  [UIView commitAnimations];

  */}



#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
        // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

        // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
        // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
        // For example: self.myOutlet = nil;
}
/*static Settings * _standardSettings = nil;
+(Settings *)standardSettings
{
    if (_standardSettings == nil)
        _standardSettings = [[Settings alloc] init];
    return _standardSettings;
}*/

-(void) setUIElements {
    [landscapeSwitch setOn:[self landscapeModeSwitch]];
        //[feedList setSelectedFeeds:[self taglist]];
}

- (void)dealloc {
    [self save];
    [plistData release];
    [plistName release];
    [super dealloc];
}


@end

I am getting the following error when I start scrolling the table view.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType addTarget:action:forControlEvents:]: unrecognized selector sent to instance 0x5f463e0'

Can somebody please help me with this error?

Cheers

+1  A: 
  • don't autorelease the switches when you alloc them. After those lines you don't own any of those objects.

    syncSwitch=[[UISwitch alloc] initWithFrame:CGRectZero];

  • release them in the dealloc method

    [syncSwitch release];

Alin
Thanks a ton... I was feeling frustrated by this stupid mistake of mine :) Thanks again for going through my code completely and helping.... Cheers
iSee