UITabBarController Weirdness ? - iphone

If I normally load up a UITabBarController and switch between views, it calls the viewWillAppear of each view controller.
But it is not so.
I want to switch to another tab as soon as another tab is touched.
If I specify a tab to load up - for example [self.tabBarController setSelectedIndex:0] in the viewWillAppear of one of the tabs (say tab 4)... It goes immediately back to tab 0.
But after that.... it does not call the viewWillAppear on any of the tabs when I switch between them.
For example, if I again go to tab 4, it does not come back to tab 0. I expect it to by a never ending cycle as I expect tab 0 to load up as soon as tab 4 is touch.
But it runs JUST ONCE !!
Why ??
Note: Question has been edited.

I think I found a solution. It works every time you click on your tab and it calls viewWillAppear on both tabs.
You can do this in your AppDelegate (or somwhere else in UITabBarController's delegate):
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
Sample code:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if([self.tabBarController.viewControllers indexOfObject:viewController] == 1) {
[self.tabBarController setSelectedIndex:0];
}
}

setting the selectedIndex won't change the selectedViewController. You will have to change selectedViewController itself. Look at the documentation for more details.

Related

Back button animation issue in iPhone

I have scenario in that, On click of Tab I am calling viewWillAppear method and but after that when I press Back button It will directly back without any animation.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
switch(mytabbar.selectedIndex)
{
case 0:
[viewController viewWillAppear:YES];
break;
}
}
All thing working fine but I don't get Back button animation is only issue
You are not allowed to call view controller life cycle methods - like viewWillAppear and viewDidLoad. They automatically called throughout the life cycle of a view as and when needed and applicable.
You need to tell us what exactly you want to implement , then we can help you?
On click of back:
- (IBAction)onBackButtonClicked:(id)sender{
[self.navigationController popViewControllerAnimated:YES];
}

go to home screen of the iphone app after coming from background

I am trying to find out how should i take the user to the home screen of my app, after he comes back from the background.
I don't want to take the user to the home screen all the time when he is coming from the background.
But only when he clicks "view" on my push notification alert and the app was in the background at that time, i want to take him to the home screen.
But if he is opening the app from the background in general he should go where ever he was left off last time he clicked on the home button and went to background
Any help is appreciated.
Thanks,
Yogesh
There one bool property in info.plist--Application does not run in background
you should change that according to your requirement.
Ok i am not sure if this right way of doing it or not, but this is what i did, as my application have a tabbarcontroller the first thing that i did is i implemented the delegate method of the tabbarcontroller "didSelectViewController"
// By doing this every time you select a tab it will come back to the rootViewController of that tab
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
if ([viewController isKindOfClass:[UINavigationController class]]){
[(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
}
}
and then on didReceiveRemoteNotification
if(tabBarController.selectedIndex == 1){
UINavigationController *navigationController = (UINavigationController*)tabBarController.selectedViewController;
[navigationController popToRootViewControllerAnimated:NO];
[[[navigationController viewControllers ] objectAtIndex:0]viewWillAppear:YES];
}else{
self.tabBarController.selectedIndex = 1;
}
so let me explain what this is doing, it is checking if the current tab is 1 if it is then it will remove all the view from the navigation stack to bring the view to the root view, if the current tab is not 1 and just make it to 1.

App Crashes in UITabBarController delegate method

Hi
I am trying to add and remove tab bar elements dynamically. There are two arrays. One is shown first with an added tabbaritem with name "More" and other array is added to the tabbar when user presses More. User can come back to first array by pressing Less tabbaritem in second array. Problem is that when i frequently press More and Less tabbaritems in sequence More, Less, More, Less, More, Less - The app crashes after last Less. Array seems ok to me and so is tabbar controller. I am not able to figure out the problem.
Below is the code of tab bar delegate method.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
NSLog(#"selected view controller is :%#",viewController);
if(viewController.view.tag == -1){
[self.tabBarController setViewControllers:self.level2TabBarItems animated:YES];
[self.tabBarController setSelectedIndex:0];
}else if(viewController.view.tag == -2){
[self.tabBarController setViewControllers:self.level1TabBarItems animated:YES];
[self.tabBarController setSelectedIndex:0];
}
}
Can anyone please let me know where I am doing wrong?
Best Regards
I had similar problem. I guess that you construct new instance of VC in your array, so frequently switching more/less causes calling method from the old instance (is not replaced yet at that moment).
Unfortunatelly setViewControllers method (as documentation say) automatically remove old view controllers calling dealloc and it seems that there is no other way to reuse them.
In your case you can try to disable selecting tabs until tabBarController:didSelectViewController: execute implementing (I didn't test it):
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
self.selectLock = YES;
// your code
self.selectLock = NO;
}
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
return !self.selectLock;
}
Make comment NSLog here. This is not proper format to print this.
May be your array's are empty. Try to set a breakpoint and you will find the solution which line is causing the crash.
I think Both if and else if are not satisfied with this condition
Just Check your Tag with this NSLog(#"%d",viewController.view.tag);

Make ajax request upon programmatically switching tabBarController viewContoller

I've been reading through forum posts and banging my head for over 2hrs now and hopefully someone can help point me in the right direction.
I am using the UITabBarController and have 4 root views associated to it.
In the first view, the user can take a picture (UIImagePicker), after which the second view is displayed programmatically. Once the second view is displayed I want to make an ajax request to a server.
I am able to sucessfully select/display the second view with the following code:
self.tabBarController.selectedIndex = 1;
However the UITabBarControllerDelegate method (which is successfully called upon user tabBarContoller touches):
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
is not called, as Apple tabBarController:didSelectViewController documentation states:
In versions of iOS prior to version 3.0, this method is called only when the selected view controller actually changes. In other words, it is not called when the same view controller is selected. In addition, the method was called for both programmatic and user-initiated changes to the selected view controller.
So my question is: "How can I execute some code & make a request after programmatically switching to second view?"
I also tried putting traces in:
-(void)viewDidAppear
-(void)ViewWillAppear
-(void)viewDidLoad
but none of those are called when tabBarController.selectedIndex is set.
Many Thanks
viewWillAppear should be called.. I just tested it.
Another solution: use the UITabBarControllerDelegate with
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
for tracking changes.

self.tabBarController.selectedIndex not calling viewDidAppear:YES

In a tabbar view when I call the tab to load useing self.tabBarController.selectedIndex the viewWillAppear is not called If i am been to the tab before hand is there a way to force the view to reload.
self.tabBarController.selectedIndex = 3;
[self.tabBarController.selectedViewController viewDidAppear:YES];
I was also thanking of dumping memory ever time i change tab's and that way when i get back to that view it reloads from the database.
you can implement
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
in the UITabBarControllerDelegate (probably your app delegate). Then in there you can manually call the methods you want on whichever index's viewController you selected.