Reputation: 377
I have a view controller which contains a tableview.This tableview is displayed in the UIPopover controller in a parent view.I want the text from the selected cell in the popover controller to get set in a UITextField in the parent view and i want to dismiss the popover after selection.I am not able to achieve this.
Code of the popover controller
.h file
#import <UIKit/UIKit.h>
@protocol SelectLocationViewControllerDelegate <NSObject>
- (void)locationSelected:(NSString *)location;
@end
@interface SelectLocationViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
IBOutlet UITableView *locationTableView;
NSArray *locationtypes;
id delegate;
}
@property (nonatomic, retain) UITableView * locationTableView;
@property (nonatomic, retain) NSArray * locationtypes;
@property (nonatomic, assign) id<SelectLocationViewControllerDelegate> delegate;
@end
.m file of the popover
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = [indexPath row];
NSString *locationSelected = [self.dwellingTypes objectAtIndex:row];
[self.delegate locationSelected: locationSelected]; // This don't gets invoked.
}
Parent Class
- (void) locationSelected:(NSString *)location {
----Here i set the the text for text field and dismiss the popover----
[popoverController dismissPopoverAnimated:YES];
}
The locationselected method which is present in the parent class doesn't gets called.
Please any body help me to over come from this issue.
Thank You
Is the popover i am creating is correct?
.h file
#import <UIKit/UIKit.h>
#import "SelectLocationViewController.h"
@interface SearchViewController : UIViewController<SelectLocationViewControllerDelegate,UIPopoverControllerDelegate>{
SelectLocationViewController * selectLocationViewController;
UIPopoverController * locationpopover;
IBOutlet UITextField *locationSelectedField;
}
@property (nonatomic, retain) UIPopoverController * locationpopover;
@property (nonatomic, retain) SelectLocationViewController * selectLocationViewController;
.m file
- (void)viewDidLoad {
selectLocationViewController=[[SelectLocationViewController alloc]init]; //The class which i am displaying inside the popover
selectLocationViewController.delegate=self;
UINavigationController *navigationcontroller=[[UINavigationController alloc]initWithRootViewController: selectLocationViewController];
locationpopover = [[UIPopoverController alloc] initWithContentViewController:navigationcontroller];
[locationpopover setPopoverContentSize:CGSizeMake(290,410) animated:YES];
[locationpopover setDelegate:self];
}
- (void)itemSelected:(NSString *)dwelling //This is the method which is called from the other class when a row is selected from the tableview in SelectLocationViewController class
{
locationSelectedField.text= dwelling;
NSLog(@"DwellingSelectedField iside tap:%@",dwelling); //I get the text printed here
[locationpopover dismissPopoverAnimated:YES];
}
Upvotes: 0
Views: 858
Reputation: 377
The problem is with delegate.I changed the method invocation from
[self.delegate locationSelected: locationSelected]
where location locationSelected is a NSString which holds the string from a selected cell.
to
[delegate locationSelected: locationSelected];
for example if i have created a protocol like
@protocol locationControllerDelegate <NSObject>
- (void)locationSelected:(NSString *)location;
@end
and in the interface of the class where protocol is declared,it should be in the following manner
@interface SelectLocationViewController : UIViewController <UITableViewDataSource, UITableViewDelegate,locationControllerDelegate> {
.
.
id delegate;
}
@property (nonatomic, assign) id<locationControllerDelegate> delegate;
@end
and in the didSelectForRowAtIndexPath method
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = [indexPath row];
NSString *locationSelected = [locationTypes objectAtIndex:row];
[delegate locationSelected: locationSelected];
}
and in the class where the method is implemented in the .h file in the interface the protocol should be inherited as like we use other delegates(UISCrollViewDelegate etc.,)and in the .m file its like a normal method implementation we can implement the method defined in the protocol
So whenever a row is selected in the TableView,this method will be invoked and the string will be set to the label or the textfield which ever you wish to set the text
Upvotes: 0
Reputation: 2461
I believe it is not called because you haven't set your delegate property. You should check this part of code. Or if it is ok add it to your post.
Upvotes: 3