Issue when checking if current viewController class is ABPersonViewController in IOS 7 - iphone

I am loading ABPeoplePickerNavigationController. On the click of a contact in the peoplepicker, I am checking a condition
if([navigationController isKindOfClass:[ABPeoplePickerNavigationController class]]
&& [viewController isKindOfClass:[ABPersonViewController class]]){
//Statements
}
But in IOS 7 I have noticed that, the second condition, that is
[viewController isKindOfClass:[ABPersonViewController class]
returns NO all the time. I know that the viewcontroller that is loaded is ABPersonViewController.
This was/is working fine until IOS 6. What could be the problem? Is there anyway I can get around this issue.
Edit:
The condition is checked inside UINavigationController Delegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
And the viewController class is shown as ABContactViewController when logged.

When checking your class you will find that iOS7 returns a different type.
Review the logic for which you need the check. You should not have to use introspection to react appropriately to a people picker action. Just implement the standard delegate method from ABPeoplePickerNavigationControllerDelegate. In particular, you have to implement:
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person;

Related

TabBarController setSelectedIndex - Which delegate method will be called

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...

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

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.