我有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
答案 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];