问题
I have an iPhone application in which I am adding push notifications.
When I am receiving the push notification I need to go to a particular view where I am loading a table view after calling a web service here. The problem is when I am standing in the same view. If I got a push message I need to reload the tableview both in the foreground and background. But when I am doing that it is not working correctly. How do I achieve this?
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"########################################didReceiveRemoteNotification****************************###################### %@",userInfo);
// Check application in forground or background
if (application.applicationState == UIApplicationStateActive)
{
if (tabBarController.selectedIndex==0)
{
NSArray *mycontrollers = self.tabBarController.viewControllers;
NSLog(@"%@",mycontrollers);
[[mycontrollers objectAtIndex:0] viewWillAppear:YES];
mycontrollers = nil;
}
tabBarController.selectedIndex = 0;
//NSLog(@"FOreGround");
//////NSLog(@"and Showing %@",userInfo)
}
else {
tabBarController.selectedIndex = 0;
}
}
回答1:
You can try with the local notification NSNotificationCenter
to reload your table when a push notification is received.
When a push notification is received then fire your local notification. In your view controller, listen to the local notification and perform the task.
For example:
In your didReceiveRemoteNotification:
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadTheTable" object:nil];
In your ViewController add Observer (in viewDidLoad
):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"reloadTheTable" object:nil];
and implement the following method:
- (void)reloadTable:(NSNotification *)notification
{
[yourTableView reloadData];
}
Also remove observer in viewDidUnload
or viewWillDisappear
.
回答2:
Swift 3 version:
in didReceiveRemoteNotification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadTheTable"), object: nil)
in your ViewController add Observer (in viewDidLoad):
NotificationCenter.default.addObserver(self, selector: #selector(self.reloadTable), name: NSNotification.Name(rawValue: "reloadTheTable"), object: nil)
and in viewWillDissapear
NotificationCenter.default.removeObserver("reloadTheTable")
回答3:
Swift 4 version: in didReceiveRemoteNotification
NotificationCenter.default.post(name: Notification.Name(rawValue: "reloadEventsTable"), object: nil)
in your ViewController add Observer (in viewDidLoad):
NotificationCenter.default.addObserver(self, selector: #selector(onReloadEventsTable), name: Notification.Name(rawValue: "reloadEventsTable"), object: nil)
About removing the observer I used to do this in deinit() but it's interesting to know that from iOS 9 you don't need to remove observers yourself, if you're not using block based observers though. https://stackoverflow.com/a/40339926/3793165
来源:https://stackoverflow.com/questions/11574154/how-do-i-reload-the-tableview-when-i-am-getting-the-push-notification