UIPopover 问题

Posted

技术标签:

【中文标题】UIPopover 问题【英文标题】:UIPopover problem 【发布时间】:2011-06-01 12:10:09 【问题描述】:

我有一个包含 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];


【问题讨论】:

【参考方案1】:

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

【讨论】:

通常在创建需要委托的对象时设置委托。所以你应该把它插入到你创建 SelectLocationViewController 的地方。 Zapko...我得到了使用 [popviewcontrollerobj setDelegate:object_of_the_class_where_mthd_is_present] 调用的方法;感谢您的帮助... 现在我的问题是弹出框没有被解除,并且选定的单元格值没有出现在 UITextField 中,但是我在该方法中有一个 NSLog,它被打印出来......我正在研究这个问题...如果您有任何想法也请告诉我 ) 我想你的 popoverController 变量现在没有指向你的 popover 控制器。 嗨 ZapKo 我有一个查询。显示在弹出框控制器内的视图是否应该始终是 UITableViewController 的子类,或者它可以是 UIViewController 类的子类。我问这个的原因是因为我当前显示的弹出框控制器是 UIViewController 类的子类...请告知...【参考方案2】:

问题出在委托上。我从

更改了方法调用

[self.delegate locationSelected: locationSelected]

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

【讨论】:

很高兴您解决了您的问题并整理了一些 Objective-C。我建议你阅读苹果documentation about objecteve-c。祝你的项目好运! 谢谢 Zapko....我会阅读文档...并使用它..感谢您的反馈... 嗨 Zapko 我还有一个问题我已经在这个链接中发布了我的问题你能说我必须做什么***.com/questions/6254571/…

以上是关于UIPopover 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 UIPopover 控制器打开 UIPopover 控制器?

从自定义 UIPopOver 问题推送新的 UIViewController

自定义 UIPopover

UIPopover 中的 UIDatePicker

无法从另一个类中关闭 UIPopover

更改通过 UIPopOver (iPad) 呈现的 UIImagePicker 的大小