I need to make changes in my UI immediately when I receive UIApplicationWillResignActiveNotification.
Here is what I do:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:nil];
- (void)applicationWillResignActive:(NSNotification *) notification {
// my changes (hide some views, change bg color, change text, etc)
// ...
}
The problem is that those changes are applied only after the application returns to the active state. So the user can see for a moment the previous state of UI.
Is there any workaround to solve this problem?
Related
I have developed an iphone application with Phonegap/Cordova v1.9.0.
I want to realize the following matter.
-When a background app comes back to be active(When the app icon is tapped), a displayed page is reloaded automatically-
Probably I should make some programs in a function, (void)applicationDidBecomeActive, in Appdelegate.m or MainViewController.m, but I have no idea what to do.
Please tell me how to solve this case.
You can use the NSNotification observer pattern. In your MainViewController.m file, and viewDidLoad, you can add an observer (registering for notifications):
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(appDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
Then you must implement appDidBecomeActive: (you can give the selector any name, but you must implement a method of that name). In this example:
- (void)appDidBecomeActive:(NSNotification *)notification {
NSLog(#"App became active");
}
When the app is resumed, and should this view controller be active, it will simply log that to the console. You can put any code you wish inside that method (in your case, refreshing a page).
Don't forget to remove the observer when the view controller is deallocated in the dealloc method. This will remove all observers for you.
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
NSLog(#"Removed all notification observers");
}
Are you really using version 1.9?
Try this:
document.addEventListener("resume", onResume, false);
function onResume() {
// Handle the resume event, reload the page or content
}
I display a view, and the data to populate one of the picker views comes down over the network after the app has loaded the view, so the picker view gets passed null so shows no items to pick from.
Is there away I can tell the UI to reload?
The view hierarchy is
Tabbar->Navbar->scrollview->Pickerviewcontroller
If the above is relevant.
assuming you have the datasource set up correctly, once it gets the data, call reloadAllComponents.
[pickerViewController reloadAllComponents];
You can use NSNotificationCenter to post a notification to update the picker when the data has finished loading
Create the notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(refreshPicker) name: #"WEBSERVICE_UPDATED" object:nil];
Post the notification
[[NSNotificationCenter defaultCenter] postNotificationName:#"WEBSERVICE_UPDATED" object:lesson];
-(void)refreshPicker {
// Handle refresh here
[pickerViewController reloadAllComponents];
}
I have several UITextFields on my view (each inside a UITableViewCell). When the keyboard is fired from any of the textfields, I need to make some animations, mainly to change the frame of the UITableView. The same must happen when the keyboard will hide.
I have done the animation, so this is not the issue here.
Now, I use NSNotificationCenter to catch displaying/hiding of the keyboard:
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];
The problem is when the keyboard is visible (a textfield is used) and I press inside another textfield. Usually for this thing keyboard will not hide, but will stay visible.
It works fine in iOS 4, but the problem comes in 3.1.3 (this is the version that I can test - possibly any version below 3.2). In versions older than 3.2 changing focus from a textfield directly to another textfield will fire the UIKeyboardWillHideNotification and UIKeyboardWillShowNotification.
Anyone knows a way to perform some animation when the keyboard will really show/hide, without the NSNotificationCenter?
Or how can I overcome this issue with versions lower than 3.2?
Thanks.
What you can do is set the textfield's/textview's delegate to the current view controller and implement these 2 methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
_keyboardWillHide = NO;
return YES;
}
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
_keyboardWillHide = NO;
return YES;
}
After that in your method that get's triggered by the UIKeyboardWillHideNotification notification you can do something like
if (_keyboardWillHide) {
// No other textfield/textview was selected so you can animate the tableView
...
}
_keyBoardWillHide = YES;
Let me know if that works for you.
Rather than avoid the notifications, you can set an NSTimer for 0.1 second to do your animations in one, and in the other, cancel the timer, that way if you get UIKeyboardWillHide and UIKeyboardWillShow both at once, you'll get a chance to cancel the timer. If you don't get both, the timer will reach zero and the animations will be carried out.
Consider using the UITextFieldDelegate protocol. The method textFieldShouldBeginEditing: will fire off before the notification and it will fire off everytime you go into the text field.
I Need to know if the user change the system time in the springboard settings.so my background program can be notified. According to doc, NSSystemClockDidChangeNotification is the one choice.
but I can't receiving anything by this:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(handleSysTimeChanged:)
name:NSSystemClockDidChangeNotification
object:nil];
Where am I wrong? Any suggestions?
Your handler method must be implemented in the same class you add as observer and needs to look like this:
-(void) handleSysTimeChanged: (NSNotification*) notification
{
// ...
}
Wonder if anyone can help me. I have a setup whereby a main menu presents the main game as a modal view controller. At this point it also stops playing the main menu music.
The problem is that when the game view controller dismisses itself (e.g when user quits game) and returns to the main menu I cannot get the main menu music to start playing again.
Is there some way I can get the music in the main menu to start playing again ? E.g a delegate method that is called when the main game dismisses ?
Thanks,
Martin
You can do it with the NotificationManager
// set up notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(playMusic:)
name:#"musicNotification"
object:nil];
// send notification
[[NSNotificationCenter defaultCenter] postNotificationName:#"musicNotification"
object:self];
// clean up notification
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
- (void) playMusic:(NSNotification *) notification
{
// play the music here
if ([[notification name] isEqualToString:#"musicNotification"])
NSLog (#"Received musicNotification!");
}