0

NSUserDefaults を使用して iPhone アプリ用のカスタム UISwitch を作成し、Pincode をセットアップするためのモーダル ビュー コントローラー (PincodeSetupViewController) を追加しました。ユーザーに表示される情報は次のとおりです。

  1. ユーザーがアプリをクリックして初めて mainViewController を起動すると、ユーザーが Pincode をセットアップしていないため、UISwitch が既に OFF に設定されていることが示されます。それは正しいです。

  2. 次のステップは、ユーザーがスイッチをオンにすることを決定したときで、モーダル ビュー コントローラー (PincodeSetupViewController) をすぐに表示する必要があります。下から上にスライドします。それは正しいです。

  3. ここで、ユーザーはアプリを閉じて、もう一度開きます。ユーザーが Pincode を設定するためにこれを行ったため、スイッチは既に ON に設定されています。それは正しいです。

  4. ユーザーは、スイッチをオフにしてオンに戻すことにしました。スイッチを再度オンにすると、すぐにモーダル ビュー コントローラー (PincodeSetupViewController) が表示されます。ここでの問題は、モーダル ビュー コントローラーがスライドを下から上に遷移せず、突然表示されることです。これは正しくありません。そのモーダル ビュー コントローラーで、スライドを突然ではなく、下から上に遷移させたいと考えています。

何が悪いのか誰か知っていますか?任意の提案をいただければ幸いです。

mainViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    customSwitch = [[RCSwitchOnOff alloc] initWithFrame:CGRectMake(1.0, 0.0, 74, 40)];  
    [customSwitchView addSubview:customSwitch];
    [customSwitch addTarget:self action:@selector(togglePincode:) forControlEvents:UIControlEventValueChanged];

}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"pincode"]) {
         NSLog(@"SWITCH MESSAGE: ON");
         [customSwitch setOn:YES];

    } else {
         NSLog(@"SWITCH MESSAGE: OFF");
         [customSwitch setOn:NO];
    }
}

- (void)togglePincode:(UISwitch *)sender {

    if(sender.on){
         NSLog(@"Switch is ON");

         NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
         [userDefaults setBool:YES forKey:@"pincode"];
         [userDefaults synchronize];

         //Check to see if the user already setup the Pincode or not.
         if ([[NSUserDefaults standardUserDefaults] boolForKey:@"setupdone_status"]) {
               NSLog(@"Display Pincode Setup");

               [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"setupdone_status"];

               UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
               UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PincodeSetupViewController"];
               [vc setModalPresentationStyle:UIModalPresentationFullScreen];

               [self presentModalViewController:vc animated:YES]; 

         } else {
               NSLog(@"No Pincode Setup");
         }

    } else {
         NSLog(@"Switch is OFF");
         NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
         [userDefaults setBool:NO forKey:@"pincode"];
         [userDefaults setBool:YES forKey:@"setupdone_status"];
         [userDefaults synchronize];
    }
}

AppDelegate.m applicationDidEnterBackground および applicationWillTerminate メソッドにコードを追加しました

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"pincode"]) {
         [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"setupdone_status"]; 

    } else {
         [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"setupdone_status"];
    }
4

1 に答える 1

2

セットアップをできる限り再現しましたが、エラーは発生しませんでした。使用したコードは次のとおりです。

//  ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
- (IBAction)switchChange:(id)sender;
@property (nonatomic, retain) NSNumber *valueOfSwitchON;
@property (weak, nonatomic) IBOutlet UISwitch *theSwitch;

@end

//  ViewController.m

#import "ViewController.h"

@implementation ViewController
@synthesize valueOfSwitchON;
@synthesize theSwitch;

- (void)viewDidLoad
{
    [super viewDidLoad];
    valueOfSwitchON = [NSNumber numberWithBool:NO];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void) viewDidAppear:(BOOL)animated
{
    if ([valueOfSwitchON boolValue] == YES) [theSwitch setOn:YES];
    else [theSwitch setOn:NO];
}

- (void)viewDidUnload
{
    [self setTheSwitch:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (IBAction)switchChange:(id)sender 
{
    if ([self.valueOfSwitchON boolValue] == NO)
    {      
        [self performSegueWithIdentifier:@"modalSegue" sender:self];
        valueOfSwitchON = [NSNumber numberWithBool:YES];
    }
    else 
    {
        valueOfSwitchON = [NSNumber numberWithBool:NO];
    }
}
@end

//  ViewController2.h

#import <UIKit/UIKit.h>

@interface ViewController2 : UIViewController
- (IBAction)closething:(id)sender;

@end

//  ViewController2.m

#import "ViewController2.h"

@interface ViewController2 ()

@end

@implementation ViewController2

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (IBAction)closething:(id)sender 
{
    [self dismissModalViewControllerAnimated:YES];
}
@end

ストーリーボード: ここに画像の説明を入力

これがお役に立てば幸いです(プログラムで作成していた多くのものを純粋にIBでセットアップしたことに注意してください)

于 2012-07-11T18:02:59.263 に答える