UITableView没有在reloadData上重新加载

时间:2014-05-27 07:10:13

标签: ios uitableview uibutton viewdidload reloaddata

我有2个观点。第一个上面有UITableView,它可以完美加载,如果我点击通过logOut触发的didSelectRowAtIndexPath方法,它也可以完美地运行。

对于登录,我有另一个View,它作为Login的模态视图加载到顶部。登录返回成功后,我希望它从第一个视图刷新UITableView上的菜单。不幸的是,这不起作用。

MenuVC.h

@interface MenuVC : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *mainNavigation;
-(void)logOut;
-(void)refreshMenu;

MenuVC.m

- (void)viewDidLoad
{

    [super viewDidLoad];

    NSLog(@"Aanwezig in viewDidLoad");

    NSUserDefaults *userData=[NSUserDefaults standardUserDefaults];

    self.mainNavigation.dataSource = self;
    self.mainNavigation.delegate = self;
    self.mainNavigation.backgroundColor = [UIColor clearColor];

    self.menu = [NSMutableArray arrayWithObjects:@"Login",@"Available", @"Downloads", @"FAQ", nil];

    if ( [userData objectForKey:@"userId"] != nil ) {

        [self.menu removeObject:@"Login"];

        [self.menu insertObject:[userData objectForKey:@"email"] atIndex:0];
        [self.menu insertObject:@"Logout" atIndex:1];

        signedInSuccess = YES;

    } 

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    NSString *cellIdentifier = @"menuCell";
    MenuCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell=[[MenuCell alloc]initWithStyle:
              UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    if ( signedInSuccess == YES && indexPath.row == 0 ) {
        NSLog(@"Disabled: %@", [self.menu objectAtIndex:indexPath.row]);
        cell.userInteractionEnabled = NO;
        cell.menuTextLabel.adjustsFontSizeToFitWidth = YES;
    } else {
        cell.userInteractionEnabled = YES;
        cell.menuTextLabel.adjustsFontSizeToFitWidth = NO;
    }


    cell.menuTextLabel.text = [self.menu objectAtIndex:indexPath.row];

    return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    // Logout and refreshMenu both work here
    if ( [identifier isEqualToString:@"Logout"] ) {
        NSLog("Logout button clicked");
        [self logOut];
        [self refreshMenu];

    }

    //Rest of the code

}

-(void)refreshMenu {

    [self viewDidLoad];
    [self.mainNavigation reloadData];

}

-(void)logOut {

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"userId"];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"email"];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"password"];
    signedInSuccess = NO;

}

上面的代码一切正常,只有在这里才会出现问题,当我点击loginClicked,然后调用refreshMenu它正在执行[self viewDidLoad],但是 NOT {来自[self.mainNavigation reloadData];方法的{1}}。

LoginVC.m

refreshMenu

1 个答案:

答案 0 :(得分:0)

首先:
你不能给自己打电话viewDidLoad。因此,请在refreshMenu中将其删除,如果您希望其他代码放入viewDidLoad,请将其转换为您在viewDidLoad中调用的方法,并且还可以调用refreshMenu

问题是,您已经创建了一个对象MenuVC。在LoginVC.m中,您执行MenuVC *MenuViewController = [[MenuVC alloc] init];它是一个全新的对象。它甚至不在屏幕上。那与前一个不一样的对象。如果您对此表示怀疑,请查看他们的指示。

如果我理解正确,您的MenuVC对象就是LoginVC对象的所有者。

因此,您可以使用的解决方案是委托模式。 这是一个你可以适应的建议。

在LoginVC.h中

@protocol LoginVCDelegate < NSObject >
-(void)didLoginWithSuccess:(BOOL)success;
@end
@property (nonatomic, week) id < LoginVCDelegate > loginDelegate;

在LoginVC.m中,loginClicked:

if ([_loginDelegate respondsToSelector:@selector(didLoginWithSuccess:)])
    [_loginDelegate didLoginWithSuccess:theBooleanYouWant];

在MenuVC.h中

@interface MenuVC : UIViewController< UITableViewDelegate, UITableViewDataSource, LoginVCDelegate >

在MenuVC.m

-(void)didLoginWithSuccess:(BOOl)success
{
    [self refreshMenu];
    //Note that you could check if login succeed or not by checking the success boolean.
}

此外,在MenuVC.m中创建LoginVC时:

[loginVC setLoginVCDelegate:self];