Проблема UIPopover - PullRequest
0 голосов
/ 01 июня 2011

У меня есть контроллер представления, который содержит представление таблицы. Это представление таблицы отображается в контроллере UIPopover в родительском представлении. Я хочу, чтобы текст из выбранной ячейки в контроллере всплывающего окна был установлен в UITextField в родительском представлении, и Я хочу отклонить всплывающее окно после выбора. Я не могу этого добиться.

Код контроллера поповера

.h файл

#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 файл поповера

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

}

Родительский класс

- (void) locationSelected:(NSString *)location {

    ----Here i set the the text for text field and dismiss the popover----
    [popoverController dismissPopoverAnimated:YES];
}

Метод locationselected, который присутствует в родительском классе, не вызывается.

Пожалуйста, помогите мне справиться с этой проблемой.

Спасибо

Является ли созданный мной поповер правильным?

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

}

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Я считаю, что он не вызывается, потому что вы не установили свой делегат свойства. Вы должны проверить эту часть кода. Или, если все в порядке, добавьте его в свой пост.

0 голосов
/ 06 июня 2011

Проблема с делегатом. Я изменил вызов метода с

[self.delegate locationSelected: locationSelected]

, где location locationSelected - строка NSString, которая содержит строку из выбранной ячейки.

к

[delegate locationSelected: locationSelected]; 

например, если я создал протокол типа

@protocol locationControllerDelegate <NSObject>

- (void)locationSelected:(NSString *)location;

@end

и в интерфейсе класса, где объявлен протокол, он должен быть следующим образом

 @interface SelectLocationViewController : UIViewController <UITableViewDataSource, UITableViewDelegate,locationControllerDelegate> {

.
.
 id delegate;


}

@property (nonatomic, assign) id<locationControllerDelegate> delegate;


@end

и в методе didSelectForRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger row = [indexPath row];

    NSString *locationSelected = [locationTypes objectAtIndex:row];

    [delegate locationSelected: locationSelected]; 

}

и в классе, где метод реализован в файле .h в интерфейсе, протокол должен наследоваться так же, как мы используем другие делегатыUISCrollViewDelegate и т. Д.,) И в файле .m это как обычная реализация метода, мы можем реализовать метод, определенный в протоколе

Так что всякий раз, когда в TableView выбирается строка, этот метод вызывается и строкабудет установлен ярлык или текстовое поле, в которое вы хотите установить текст

...