故事板 - 弹出框的委托

Posted

技术标签:

【中文标题】故事板 - 弹出框的委托【英文标题】:storyboard - delegate for popover 【发布时间】:2012-12-30 03:39:56 【问题描述】:

我正在使用弹出框,弹出框内部包含一个 uitableview,我想在点击 uitableview 时获得价值,我在里面创建委托

popover.h

@class PopOverVCDelegate;
@protocol PopOverVCDelegate <NSObject>

-(void)getValue:(int)value;

@end

@interface ..

@property(nonatomic)id<PopOverVCDelegate> delegate;

@end

popover.m

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

    [self.delegate getValue:[indexPath row]];

而主类接收委托是

mainclass.h

#import "PopOverVC.h"
@interface MainClassVC : UIViewController<PopupCatchupVCDelegate,UIPopoverControllerDelegate>

mainclass.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"showPopover"])
    
        [[segue destinationViewController] setDelegate:self];
        UIPopoverController *p = [(UIStoryboardPopoverSegue *)segue popoverController];
        p.popoverBackgroundViewClass = [CustomPopoverBackground class];
        self.popoverController = p;        
        popoverController.delegate = self;
    


-(void)getValue:(int)value

    NSLog(@"adsf-%d",value);

我没有从委托人那里得到任何价值。任何人都可以帮助我,我使用情节提要并从推送导航中调用弹出框。

【问题讨论】:

【参考方案1】:

在 popover.h 中,您声明了协议 PopOverVCDelegate & 在 mainclass.h 中,您正在实现 PopupCatchupVCDelegate 协议。您的主类应该向 PopOverVCDelegate 确认。

@interface MainClassVC : UIViewController<PopOverVCDelegate, PopupCatchupVCDelegate, UIPopoverControllerDelegate>

另外你应该在调用它之前检查委托方法是否被实现-

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

    if([self.delegate respondsToSelector:@selector(getValue:)])
        [self.delegate getValue:[indexPath row]];

编辑

我查看了故事板并注意到,您的委托没有设置为正确的控制器。您正在将委托设置为 p(UIPopoverController),您应该将其设置为 popover 的 contentViewController(PopOver)。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"idenPopover"])
    
        [[segue destinationViewController] setDelegate:self];
        UIPopoverController *p = [(UIStoryboardPopoverSegue *)segue popoverController];
        p.popoverBackgroundViewClass = [CustomPopoverBackground class];
        self.popoverController = p;
        self.popoverController.delegate = self;

        //set delegate to PopOver 
        UINavigationController *navigationController = (UINavigationController*)p.contentViewController;
        PopOver *popOver = (PopOver*)navigationController.topViewController;
        [popOver setDelegate:self];
    

【讨论】:

我已经在preparesegue调用delegate is -> popoverController.delegate = self; 我说的是确认协议而不是设置委托。在您的 mainclass.h @interface MainClassVC 中放入以下行: UIViewController 我没有使用 prepareForSegue 但我认为你在那里做错了什么。您是否在情节提要中为弹出框正确设置了自定义类。 你能通过这里的链接从我这里下载代码吗 -> mediafire.com/?90t8gojmk18h2ia

以上是关于故事板 - 弹出框的委托的主要内容,如果未能解决你的问题,请参考以下文章

试图关闭故事板呈现的弹出框

为啥故事板弹出框在 Swift 中的设备上不起作用?

在通用故事板中使用 present 作为弹出框

iPad 故事板应用程序 - 弹出框和模态代表

故事板:如何弹出而不是全屏

iPhone上弹出框的后退箭头