проблема UIPoover

У меня есть контроллер представления, который содержит табличное представление. Это табличное представление отображается в контроллере 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];

}

person Sankar Chandra Bose    schedule 01.06.2011    source источник


Ответы (2)


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

person Zapko    schedule 01.06.2011
comment
Обычно делегаты задаются при создании объекта, которому требуется делегат. Поэтому вы должны вставить его в то место, где вы создаете SelectLocationViewController. - person Zapko; 02.06.2011
comment
Zapko... я получил метод, вызванный с помощью [popviewcontrollerobj setDelegate:object_of_the_class_where_mthd_is_present]; Спасибо за вашу помощь... - person Sankar Chandra Bose; 02.06.2011
comment
Теперь моя проблема в том, что всплывающее окно не отклоняется, и значение выбранных ячеек не поступает в UITextField, но у меня есть NSLog внутри этого метода, там он печатается...... Я изучаю эту проблему.. .Если у вас есть какие-либо идеи, пожалуйста, дайте мне знать - person Sankar Chandra Bose; 02.06.2011
comment
) Я полагаю, что ваша переменная popoverController теперь не указывает на ваш контроллер popover. - person Zapko; 02.06.2011
comment
Привет ZapKo, у меня есть один вопрос. Должно ли представление, отображаемое внутри контроллера всплывающего окна, всегда быть подклассом UITableViewController или оно может быть подклассом класса UIViewController. Почему я спрашиваю об этом, потому что контроллер всплывающего окна, которым я являюсь в настоящее время отображение является подклассом класса UIViewController... Пожалуйста, сообщите... - person Sankar Chandra Bose; 02.06.2011
comment
@Sankar, конечно, это может быть любой UIViewController или его подклассы. Вы можете проверить документация документация по этому вопросу - person Zapko; 02.06.2011
comment
Запко, я просмотрел документацию, спасибо за ссылку. Я отредактировал свой пост и добавил код, чтобы показать вам, как я создаю всплывающее окно и как я его отклоняю. Не могли бы вы сказать мне, правильно ли я создаю всплывающее окно и отклоняю его? - person Sankar Chandra Bose; 02.06.2011
comment
@Санкар, выглядит нормально. Работает ли это так, как ожидалось? PS Вы можете освободить selectLocationViewController, как только передадите его всплывающему окну. - person Zapko; 02.06.2011
comment
Я выпустил его. Я действительно сыт по горло этой проблемой. Тем не менее я не могу найти решение. Спасибо, что отвечали все это время. не нахожу решения. Я стараюсь изо всех сил решить проблему. - person Sankar Chandra Bose; 02.06.2011
comment
Запко решил проблему. Вы великий гений. То, что вы подозревали в своем первом ответе, правда. Проблема была с моим делегатом. Пожалуйста, проверьте мой ответ на тот же вопрос и любезно дайте мне знать ваши отзывы - person Sankar Chandra Bose; 06.06.2011

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

[self.delegate locationSelected: locationSelected]

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

to

[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 выбрана строка, этот метод будет вызываться, и строка будет установлена ​​​​в метку или текстовое поле, которое вы хотите установить для текста.

person Sankar Chandra Bose    schedule 06.06.2011
comment
Я рад, что вы решили свою проблему и немного разобрались с Objective-C. Я рекомендую вам читать яблоки документация об объекте-c. И удачи вашему проекту! - person Zapko; 06.06.2011
comment
Спасибо, Zapko....Я прочитаю документацию...и воспользуюсь ею..Спасибо за ваш отзыв... - person Sankar Chandra Bose; 06.06.2011
comment
Привет, Запко, у меня есть еще одна проблема. Я разместил свой вопрос по этой ссылке. Можете ли вы сказать, что мне нужно сделать stackoverflow.com/questions/6254571/ - person Sankar Chandra Bose; 07.06.2011