在多个ViewControllers上登录UIAlertView

时间:2015-03-19 02:53:43

标签: ios xcode uialertview

我正在尝试为我正在为类项目开发的应用程序创建一个登录系统。此登录按钮将显示在大多数视图的导航栏上,因此我在考虑在各个视图控制器中初始化的单独类,以创建UIAlertView并处理应用程序与服务器的通信。我遇到的问题是在检查并保存用户名和密码后将登录文本更改为“注销”。我已经能够显示UIAlertView并与服务器通信,但我仍然坚持改变文本。我最初在视图控制器中放置一个方法来更改文本,但没有成功,但在用户文件中更可取。这是我第一次使用单身人士,所以我不确定正确性。我是以错误的方式解决这个问题,还有更好的方法吗?谢谢你的帮助。

HomeViewController.m

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    self.navigationController.navigationBar.topItem.title = @"Home";
    UIBarButtonItem *login = [[UIBarButtonItem alloc] initWithTitle:@"Log In" style:UIBarButtonItemStylePlain target:self action:@selector(log)];
    self.navigationController.navigationBar.topItem.rightBarButtonItem = login;
}
-(void)log {
    User* singleton = [User getInstance];
    [singleton sign];
}

/*
-(void)logfinish {
    if ([[NSUserDefaults standardUserDefaults] stringForKey:@"Username"] && [[NSUserDefaults standardUserDefaults] stringForKey:@"Password"]) {
        UIBarButtonItem *logout = [[UIBarButtonItem alloc] initWithTitle:@"Log Out" style:UIBarButtonItemStylePlain target:self action:nil];
        self.navigationController.navigationBar.topItem.rightBarButtonItem = logout;
    }
}*/

User.m

@implementation User

static User *singletonInstance;

+ (User*)getInstance{
    if (singletonInstance == nil) {
        singletonInstance = [[super alloc] init];
    }
    return singletonInstance;
}

-(void)sign {
    if (![[NSUserDefaults standardUserDefaults] stringForKey:@"Username"] && ![[NSUserDefaults standardUserDefaults] stringForKey:@"Password"]) {
        signAlert = [[UIAlertView alloc] initWithTitle:@"Log In" message:@"Please sign into your account" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Log In", nil];
        signAlert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
        [signAlert show];
    }
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *person = [signAlert textFieldAtIndex:0].text;
    NSString *pass = [signAlert textFieldAtIndex:1].text;
    NSDictionary *params = @ {@"User": person, @"Password" :pass};

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager GET:signIn parameters:params success:^(AFHTTPRequestOperation *operation, NSData* response) {
        NSString *responsef = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
        //NSLog(@"%@", responsef);
        [self check:responsef user:params];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

-(void)check:(NSString*) pass user:(NSDictionary*)nandp {
    if ([pass isEqualToString:@"Success"]) {
        [[NSUserDefaults standardUserDefaults] setValue:[nandp objectForKey:@"User"] forKey:@"Username"];
        [[NSUserDefaults standardUserDefaults] setValue:[nandp objectForKey:@"Password"] forKey:@"Password"];
        //NSLog(@"%@ logged in", [[NSUserDefaults standardUserDefaults] stringForKey:@"Username"]);
        //HomeViewController *view = [[HomeViewController alloc] init];
        //[view logfinish];
    }
    else NSLog(@"Failure");
}

1 个答案:

答案 0 :(得分:0)

这只是一种做法。 声明一个实例变量,如:

@implementation User {
 UIViewController *viewController;
}

将您正在调用的viewController作为参数传递给方法sign,例如:

-(void)sign:(UIViewController *)viewControllerParam {
    if (![[NSUserDefaults standardUserDefaults] stringForKey:@"Username"] && ![[NSUserDefaults standardUserDefaults] stringForKey:@"Password"]) {
        signAlert = [[UIAlertView alloc] initWithTitle:@"Log In" message:@"Please sign into your account" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Log In", nil];
        signAlert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
        viewController = viewControllerParam; // assigning to ivar for future use
        [signAlert show];
    }
}

将此参数保存到您的实例变量以供将来参考。
现在,您可以使用此变量调用viewController中的方法,该方法更改右侧栏按钮项:

-(void)check:(NSString*) pass user:(NSDictionary*)nandp {
    if ([pass isEqualToString:@"Success"]) {
        [[NSUserDefaults standardUserDefaults] setValue:[nandp objectForKey:@"User"] forKey:@"Username"];
        [[NSUserDefaults standardUserDefaults] setValue:[nandp objectForKey:@"Password"] forKey:@"Password"];
        [viewController logfinish]; // call the respective method
    }
    else NSLog(@"Failure");
} 

希望这有帮助! :)