开发者

Unrecognized selector sent. Objective-C error

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)sectio开发者_运维百科n {
        // 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


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];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜