我有一个包含两个项目的菜单,登录和设置,显示在tableView中。登录和设置存储在NSArray中。在ViewDidLoad上,我正在检查用户是否存在于NSUserDefaults中。如果用户存在,则将登录更改为注销,反之亦然。问题是,在ViewDidLoad上,只有在从缓存中清除应用程序后才会更改名称一次。因此,为了在登录或登出后查看更改,您需要从缓存中清除应用程序并重新打开它。我希望立即应用更改。每次在菜单打开前单击菜单按钮并访问viewDidAppear。我知道这是因为我设置了一个断点并追踪它。它做了应有的事情。但它永远不会将login的值更改为logout,反之亦然。
MenuController。
-(void)ChangeLoginLabel {
NSUserDefaults *data = [NSUserDefaults standardUserDefaults];
NSString *User = [data objectForKey:@"User"];
if(User==nil) {
_extraMenuItems = [[NSMutableArray alloc] initWithObjects:@"Settings", @"Login", nil];
}
else {
_extraMenuItems = [[NSMutableArray alloc] initWithObjects:@"Settings", @"Logout", nil];
}
}
- (void)viewWillAppear:(BOOL)animated {
[self ChangeLoginLabel];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self ChangeLoginLabel];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex
{
return self.extraMenuItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = @"Formal";
UITableViewCell *cell = [self.extraTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
NSString *cellValue = [self.extraMenuItems objectAtIndex:indexPath.row];
cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
cell.textLabel.numberOfLines = 0;
cell.textLabel.text = cellValue;
cell.textLabel.textColor = [UIColor blackColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
NSLog(@"Settings cell tapped!");
}
else if (indexPath.row == 1)
{
//closes when login view appears
[self.slidingViewController resetTopView];
NSString *LoginTextLabel = [self.extraMenuItems objectAtIndex:indexPath.row];
if([LoginTextLabel isEqualToString:@"Logout"]) {
}
else {
UIViewController * vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
[self presentViewController:vc animated:YES completion:nil];
}
}
// Deselect the row
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
日志
2014-12-12 13:06:53.290 xxx[1695:270056] _extraMenuItems: (
Settings,
Login
)
2014-12-12 13:07:04.290 xxx[1695:270056] _extraMenuItems: (
Settings,
Logout
)
如何在用户登录或注销时强制数组立即更改值?
答案 0 :(得分:1)
您想要viewWillAppear
吗? viewDidAppear
在视图已经呈现之后发生我认为。
答案 1 :(得分:1)
呼叫
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self ChangeLoginLabel];
}
或
- (void)viewDidAppear:(BOOL)animated {
[super viewDifAppear:animated];
[self ChangeLoginLabel];
}
答案 2 :(得分:1)
如果我理解正确,你会尝试根据来自另一个视图控制器的登录/注销触发的NSUserDefaults
更改来更新表中的标签;因此,当您返回MenuViewController
时ChangeLoginLabel
由viewDidAppear
触发时,extraMenuItems
数组实际上设置为包含适当的值,并且您希望标签位于表格相应地改变。但问题是,你在返回视图时没有重新加载表格。
首先,我建议您从[self ChangeLoginLabel];
删除viewDidLoad
,因为它是多余的。其次,我建议您更改ChangeLoginLabel
方法以包含表重新加载,如下所示:
-(void)ChangeLoginLabel {
NSUserDefaults *data = [NSUserDefaults standardUserDefaults];
NSString *User = [data objectForKey:@"User"];
if(User==nil) {
self.extraMenuItems = [[NSMutableArray alloc] initWithObjects:@"Settings", @"Login", nil];
}
else {
self.extraMenuItems = [[NSMutableArray alloc] initWithObjects:@"Settings", @"Logout", nil];
}
[self.tableView reloadData];
}
- (void)viewWillAppear:(BOOL)animated {
[self ChangeLoginLabel];
}
或者,如果您只想重新加载相关行,则可以将[self.tableView reloadData];
替换为:
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];