TabBarController setSelectedIndex - Which delegate method will be called - iphone

I would like to know when we are setting setSelectedIndex for uitabbbarviewcontroller,
Which delegate method will be called.
In my app, i have list of songs to purchase.when user taps buy button for any song, i will show the downloading tab.for that i am setting [self.tabBarController setSelectedIndex:3];there i am showing the song details and progressview that how much is downaloded etc.
This is fine upto this.in the meanwhile of downaloding poem the user can go and tap buy another poem.
here i want to reload the tableview.but i dont know in which delegate method i should call reload data for tableview.
I tried viewwillappear and viewdidappear. but these are not called.
So please tell me which delegate method will be called.
Thanks a lot

override UITabBarController setSelectedIndex:
-(void)setSelectedIndex:(NSUInteger)selectedIndex
{
//must call super function.
[super setSelectedIndex:selectedIndex];
[self myMethod];
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
[self myMethod];
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
is called only when user taps it, when you programmatically set this, it is not called.
You can fire a custom delegate method or notification as soon as you do it programmatically and do what ever you need to do...

Related

How to use activity indicator in tabbar controller while switching tab item

I am using tab bar controller in my project.in each class's viewWillAppear i am parsing some data it takes some time to load. i put activity indicator before parsing the data in viewWillAppear but it is not working..and also itried below code also that too not worked what to do?
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController: (UIViewController *)viewController
{
[NSThread detachNewThreadSelector:#selector(threadStartAnimating) toTarget:self withObject:nil];
}
Finally i got the solution of my issue... i called the parsing class in view will appear method that makes me the problem..instead of calling the parsing class in view will appear method i created one user defined method(GetData). In that method i called the parsing class. in view will appear i called the user defined method(GetData) by following code.
[self performSelector:#selector(GetData) withObject:self afterDelay:1];

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];
}

How to show alert before UIViewController is popped from UINavigationController

I have A UINavigationController which is managing multiple UIViewControllers. When at the top of the view controller hierachy, and when back is pressed, I want to show a UIAlertView to ask the user if they are sure that they want to go back. What is the best way to check if the view is popped?
I think there is no specific message for the back button.
But you can try to subclass UINavigationController and then override the method popViewControllerAnimated:. (I haven't tried it.)
Another option is to create a custom back button of the type UIBarButtonItem and add a target and action for this button.
This can be done by subclassing UINavigationController and overriding
(BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
}
overriding popViewControllerAnimated: is too late to cancel a pop.
I think that the only way that works is taking a screenshot of the view, cutting out the button, and then adding a uibutton to you navigationController bar. Then you set the image that you have cut out to be the buttons image, after that you create an action with just a uialertview. Set your class as Uialertviewdelegate, and pop the viewcontroller when the user presses the ok button using
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex {
if (buttonIndex == 0)
{
//pop viewcontroller
}
}
What about using the UINavigationControllerDelegate-Methods like
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
and check if the controller which should get pushed is of that kind that it needs an warning. The other way around would also work!

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);

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.