【问题标题】:Custom Delegate, dismiss popover from another view自定义委托,从另一个视图中关闭弹出框
【发布时间】:2012-05-31 20:05:21
【问题描述】:

我可以在自定义委托方面使用一些帮助。我正在尝试制定一个协议,向其代表发送消息以关闭弹出视图。这是我正在尝试的。

在popoverViewController.h中

#import <UIKit/UIKit.h>


@protocol MyPopoverDelegate <NSObject>
-(void) didSelectLanguage;
@end



@interface Popover : UITableViewController{

    id <MyPopoverDelegate> delegate;
    NSMutableArray *languageData;

}

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

@end

.m

@synthesize delegate;

...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"You selected %@", [languageData objectAtIndex:[indexPath row]]);
    [self.delegate didSelectLanguage];

}

...

在呈现弹出框的 ViewController 中

#import <UIKit/UIKit.h>
#import "popoverViewController.h"




@interface ChoicesChoices : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate>{

    UIPopoverController *popover;




}
- (IBAction)facebook:(id)sender;
- (IBAction)twitter:(id)sender;
- (IBAction)sms:(id)sender;
- (IBAction)copy:(id)sender;
- (IBAction)email:(id)sender;
- (IBAction)home:(id)sender;
- (IBAction)mute:(id)sender;
- (IBAction)note:(id)sender;


@property (nonatomic, retain) UIPopoverController* popover;


@end

和.m

@synthesize popover;

...

- (void)didSelectLanguage{
[popover dismissPopoverAnimated:YES];
NSLog(@"didSelectLanguage fired");
}

当我在弹出框的表中选择一行时,不会调用 didSelectLanguage。关于我可能做错了什么的任何想法?感谢您的帮助。

【问题讨论】:

  • 您确定代表不是nil?换句话说,因为你没有显示代码,我不得不问,你是否真的将委托设置为你的 ChoicesChoices 视图控制器的实例?
  • 我不确定。那会是什么样子?它会进入.m吗?
  • 示例见下文

标签: iphone xcode ipad uipopovercontroller popover


【解决方案1】:

确保将代理设置为呈现弹出框的视图控制器。 ChoicesChoices.m 中的类似内容:

- (void)presentPopover
{
  // assuming ARC for all allocations
    Popover *myController = [Popover new];
    myController.delegate = self;
    self.popover = [[UIPopoverController alloc] initWithContentViewController:myController];
    [self.popover presentPopover...];  // two flavors here, FromRect: and FromBarButtonItem:, that's left up to you to choose which one is correct.
}

【讨论】:

    【解决方案2】:

    确保在创建自定义类的实例时在呈现视图控制器中设置委托。

    popover.delegate = self
    

    此外,您的属性看起来像是标准的弹出框控制器,而不是您的自定义视图控制器的实例。

    【讨论】:

    • 实际上,他的popover 属性是有道理的。它并不是指弹出框包含的视图控制器,而是弹出框本身。所以你的popover.delegate = self; 是在正确的方向,错误的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多