NSArray不会覆盖viewDidAppear

时间:2014-12-12 17:03:32

标签: ios objective-c xcode

我有一个包含两个项目的菜单,登录和设置,显示在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
)

如何在用户登录或注销时强制数组立即更改值?

3 个答案:

答案 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更改来更新表中的标签;因此,当您返回MenuViewControllerChangeLoginLabelviewDidAppear触发时,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];