在多个ViewControllers上登录UIAlertView

问题描述:

我正在尝试为我正在为类项目开发的应用程序在系统中创建日志。此登录按钮将显示在大多数视图的导航栏上,因此我正在考虑在各种视图控制器中初始化一个单独的类以创建UIAlertView并处理应用程序与服务器的通信。我遇到的问题是在检查并保存用户名和密码后将登录文本更改为注销。我已经能够显示UIAlertView并与服务器交谈,但我一直在改变文本。我最初在视图控制器中放置了一个方法来更改文本,但没有成功,但在用户文件中更好。这是我第一次使用单身人士,所以我不确定是否正确。我是否以错误的方式去做,有没有更好的方法?谢谢你的帮助。在多个ViewControllers上登录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"); 
} 
+0

只是你应该记下的东西。从UIAlertView的Apple文档中,“*重要:UIAlertView在iOS 8中已弃用。(请注意,UIAlertViewDelegate也不推荐使用。)要在iOS 8和更高版本中创建和管理警报,请使用UIAlertController和UIAlertControllerStyleAlert。*的”preferredStyle“*” – Jeffrey 2015-03-19 02:56:57

+0

你有什么尝试?你没有写任何代码来改变条形按钮项目的标题。这是你要求的吗? – GoGreen 2015-03-19 03:42:21

+0

并且关于singletons,我建议你使用GCD的singleton API。下面是一个很好的教程,解释相同的内容:[iOS设计模式](http://www.raywenderlich.com/46988/ios-design-patterns) – GoGreen 2015-03-19 03:43:55

这仅仅是一个做的方式。 声明一个实例变量,如:

@implementation User { 
UIViewController *viewController; 
} 

传递您是从作为参数调用的方法sign如的viewController:

-(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"); 
} 

希望这有助于! :)

+0

这只是一个肮脏的修复。您并不总是必须更换正确的酒吧按钮项目。您可以遍历导航项目,然后替换标题和选择器。正如我前面指出的,我强烈建议你使用GCD api作为单例类:[dispatch_once](http://*.com/a/9119089/2954866)。另请参阅本教程:[iOS设计模式](http://www.raywenderlich.com/46988/ios-design-patterns) – GoGreen 2015-03-19 13:51:30