0

我有一个包含 tableview 的视图控制器。这个 tableview 显示在父视图的 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];

}
4

2 回答 2

3

我相信它没有被调用,因为你没有设置你的委托属性。您应该检查这部分代码。或者,如果可以,请将其添加到您的帖子中。

于 2011-06-01T12:41:59.357 回答
0

问题出在委托上。我将方法调用从

[self.delegate locationSelected: locationSelected]

其中 location locationSelected 是一个 NSString,它保存来自选定单元格的字符串。

[delegate locationSelected: locationSelected]; 

例如,如果我创建了一个像

@protocol locationControllerDelegate <NSObject>

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

@end

并且在声明protocol的类的接口中,应该是如下方式

 @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 中选择一行时,都会调用此方法,并将字符串设置为您希望设置文本的标签或文本字段

于 2011-06-06T04:26:43.287 回答