【问题标题】:Storyboard: Dismissing Popover using delegate/protocol method故事板:使用委托/协议方法关闭 Popover
【发布时间】:2012-06-11 14:09:54
【问题描述】:

我已经阅读了 的内容,虽然大多数似乎是关于非故事板方法的,但我认为我已经拼凑起来并弄清楚了。但是,以下代码不会导致我的弹出框被解除。 Popover 中的dismissPopoverButtonPressed 按钮执行,但委托中的dismissPopover 方法中的断点从未命中。非常感谢有人仔细查看代码以发现错误。

谢谢

在下面,NewGameViewController 包含一个 UIButton。按下此按钮会导致 Popover Segue 和随后显示包含 PopViewController UIView 的弹出框。

NewGameViewController.h

#import "PopViewController.h"
@interface NewGameViewController: UIViewController <DismissPopoverDelegate>
{
    UIPopoverController *popover;
}

NewGameViewController.m

@implementation NewGameViewController
-(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"popoverSegue"])
    {
        popover = [(UIStoryboardPopoverSegue *)segue popoverController];
        // getting warning: Assigning to 'id<UIPopoverControllerDelegate>' from incompatible type 'NewGameViewController *const__strong'
        //popover.delegate = self;
    }
}

-(void)dismissPopover
{
    [popover dismissPopoverAnimated:YES];
}

PopViewController.h

@protocol DismissPopoverDelegate <NSObject>
-(void) dismissPopover;
@end

@interface PopViewController: UIViewController
{
    __unsafe_unretained id<DismissPopoverDelegate> delegate;
}

@property (nonatomic, assign) id<DismissPopoverDelegate> delegate;
-(IBAction)dismissPopoverButtonPressed:(id)sender;
@end

PopViewController.m

#import "NewGameViewController.h"
@implementation PopViewController
@synthesize delegate;
-(IBAction)dismissPopoverButtonPressed:(id)sender
{
    [self.delegate dismissPopover];
}

【问题讨论】:

    标签: xcode uibutton storyboard popover


    【解决方案1】:

    当从故事板转场链接到弹出框控制器时,转场的popoverController 属性指的是标准的 UIPopoverController。这个控制器本身有一个属性,contentViewController,它将代表实际上在弹出窗口中呈现的视图控制器,在你的例子中是PopViewController

    因此,您当前的代码将自己设置为弹出框控制器的委托,而实际上它确实需要将自己设置为弹出框 content 视图控制器的委托。

    您仍然需要保留对弹出框控制器的引用,以便关闭,因此保留现有代码,但进行以下更改:

    -(void)prepareForSegue:(UIStoryboardPopoverSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"popoverSegue"])
        {
            popover = [(UIStoryboardPopoverSegue *)segue popoverController];
            // Get a reference to the content view controller of the popover
            PopViewController *popVC = (PopViewController*)popover.contentViewController;
            // Set ourselves as the content VC's delegate
            popVC.delegate = self;
        }
    }
    

    【讨论】:

    • 谢谢。我必须承认,我实现了这段代码并没有完全理解逻辑,但我记得阅读过多个 cmets 关于必须显式声明协议和委托的内容,以便可以在生成它的 VC 中处理 Popover 事件。当然,根据 Popover 是在代码中显式创建还是通过 Storyboard 创建,方法似乎有所不同。话虽如此,我在上述方面仍然不明智。
    • 我还尝试按照您的建议重命名“代表”以防止发生冲突,但这没有任何区别。当你说我的 popover ivar 应该更具体地键入时 - 你的意思是什么?
    • 如果 SHARRP 正在看这个,您是否愿意创建一个示例项目(类似于您为 stackoverflow.com/questions/5922254/… 所做的那个),它做同样的事情,但使用故事板(即控制-将 segue 拖到 UIViewController,其视图将出现在 Popover 内)。我上面的代码是尝试实现您的示例,但有些地方不对劲,Storyboard/Segue 的使用似乎是主要区别。
    • 对不起,我又看了一遍你的问题,我之前的回答不正确。请看我编辑的,希望能给你更多的解释和可行的解决方案!
    • jturton - 宾果游戏。确实非常感谢。解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多