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 后文本字段没有被选中