UITableView 没有在 reloadData 上重新加载

Posted

技术标签:

【中文标题】UITableView 没有在 reloadData 上重新加载【英文标题】:UITableView not reloading on reloadData 【发布时间】:2014-05-27 07:10:12 【问题描述】:

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

对于登录,我有另一个视图,它作为登录的模式视图加载在顶部。一旦登录返回成功,我希望它从第一个视图刷新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]; refreshMenu 方法。

LoginVC.m

#import "MenuVC.h"

- (IBAction)loginClicked:(id)sender 
    
         // If login process is success (which works)
         MenuVC *MenuViewController = [[MenuVC alloc] init];
         [MenuViewController refreshMenu];

【问题讨论】:

嗯,首先,你不应该调用[self viewDidLoad]; 然后,你初始化了MenuVC。和上一个是同一个对象吗? 你设置的是tableview的delegate还是数据源? 移除 [self viewDidLoad];从 menurefresh 方法不要在实现类中用户定义的方法中的任何地方调用 viewDidload.. alloc后不调用[MenuViewController refreshMenu],而是调用方法[self.mainNavigation reloadData];在 MenuVC.m 的 viewDidLoad 中 我添加了更多代码只是为了清除问题,希望这有助于我解决这个问题。@Larme,如果我删除它,当我点击“didSelectRowAtIndexPath -注销”不再起作用。马卡雷特,是的,我做到了。 user2071152 这似乎不起作用。 【参考方案1】:

首先: 你不会称自己为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];

【讨论】:

以上是关于UITableView 没有在 reloadData 上重新加载的主要内容,如果未能解决你的问题,请参考以下文章

UITableView,UILabel 文本颜色在选择行时没有改变? [关闭]

为啥这个 UIView 没有出现在 UITableView 前面?

在 UITableView 上 reloadData 后文本字段没有被选中

UITableView 在 segmentedControlChanged 上没有改变

UITableView 滚动条没有拉伸

UITableview 没有在 iOS 中使用自动布局调整大小