【问题标题】:Dismiss popover on UIButton click is not working, what am I doing wrong?关闭 UIButton 点击​​弹出框不起作用,我做错了什么?
【发布时间】:2012-07-17 13:49:32
【问题描述】:

我正在尝试关闭弹出框并在单击弹出框中的按钮时返回一个变量。有四个按钮,在选择一个按钮时,变量(基于按钮)将返回到原始视图控制器并且弹出框将关闭。我不确定如何尝试传递变量,但我正在尝试使用此页面(http://stackoverflow.com/questions/3565968/dismiss-popover-using-uibutton)至少在按钮单击时关闭弹出框),由于某种原因,这对我不起作用。当我点击按钮时,绝对没有任何反应。

AddWineViewController 是“根”视图控制器

//AddWineViewController.h
//this is the "root" view controller
#import "WineStyleViewController.h"
@interface AddWineViewController : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate>
@property (nonatomic, retain) UIPopoverController *myPopoverController;

 

//AddWineViewController.m
@implementation AddWineViewController
@synthesize myPopoverController;
-(void)didClickCancelButton {
    //I would like to have the variable passed here, something like self.wineStyle.text=wineStyle; where wineStyle is the variable from the popover.
    [myPopoverController dismissPopoverAnimated:YES];
}

WineStyleViewController 是弹出视图控制器

//WineStyleViewController.h
@protocol MyPopoverDelegate <NSObject>
    -(void)didClickCancelButton;
@end
@interface WineStyleViewController : UIViewController
@property (nonatomic, assign) id<MyPopoverDelegate> delegate; 
@property (nonatomic, strong) NSString *wineStyle;
- (IBAction)redWineButton:(id)sender;

 

//WineStyleViewController.m
@implementation WineStyleViewController
@synthesize wineStyle;
@synthesize delegate;

- (IBAction)redWineButton:(id)sender {
    wineStyle=@"Red";
    [self.delegate didClickCancelButton];
}

【问题讨论】:

  • 请显示设置WineStyleViewController 并创建AddWineViewController 实例的代码。这不会创建一个保留周期吗?.. 您可能需要让您的委托 __weak,尽管这肯定不是导致此问题的原因。

标签: objective-c xcode xcode4.3 uipopovercontroller popover


【解决方案1】:

我将首先做一些假设,即故事板中的所有连接都已连接,并且所有对象都已正确创建,并且您已在 segue 中将委托设置为 self。

只是为了确定...确保您的转场包括:

// set your destination view controller
WineStyleViewController *destinationController = segue.destinationViewController;
destinationController.delegate=self;

在您的委托(弹出框):WineStyleViewController 中,您将协议定义为:

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

但是您想将 wineStyle 传回给根控制器 (AddWineViewController),因此您需要 1) 添加要传回的变量 (wineStyle) 和 2) 传递您的委托的 ViewController(我冒昧地更改为 Save 而不是取消)

@protocol MyPopoverDelegate <NSObject>
-(void)didClickSaveButton (WineStyleViewController *)wineStyleViewController withWineStyle (NSString *)wineStyle;
@end

现在回到 AddWineViewController:

您的-(void)didClickCancelButton:(WineStyle)wineStyle 是您从代表那里收到您的葡萄酒风格的地方,所以这个方法应该看起来更像:(再次更改它保存)

-(void)didSave
{
    // your methods for dealing with your added wineStyle go hear, as
    // you will already have wineStyle sent back to you from your delegate
    [myPopoverController dismissPopoverAnimated:YES];
} 

希望对您有所帮助:D

【讨论】:

    【解决方案2】:

    我假设您已正确建立 IBAction 连接(并且当您按下按钮时该方法实际上正在执行);所以我的下一个想法是 self.delegate 没有正确设置,因为控制器正在屏幕上显示(在 AddWineViewController 的方法中显示弹出框)。

    另外,我应该提一下,我可能会考虑一些事情来稍微改变协议的接口:

    1. 我不会告诉代理按下取消来触发弹出框的解除;告诉它已经进行了选择。
    2. 我更喜欢在签名中传递“孩子”的协议方法:[self.delegate didChooseWineStyle: self]

    【讨论】:

    • 感谢您的回答。我在网上使用了一个示例,这就是为什么我选择“取消”作为按钮文本的原因,但这不是我长期保留的内容。动作设置正确。您建议的代码[self.delegate didChooseWineStyle:self] 导致错误:No known instance method for selector 'didClickCancelButton'
    • 您需要在委托的类中编写该方法(并可能通过@protocol 将其放入委托的公共接口中)。
    • 谢谢,我想我已经弄清楚了,但我最终使用了选择器而不是桌子。我正在慢慢掌握这个窍门!
    【解决方案3】:

    要将“wineStyle”传递给“MyPopover”协议,只需将变量添加到协议:

    @protocol MyPopoverDelegate <NSObject>
        -(void)didClickCancelButton:(WineStyle)wineStyle;
    @end
    

    ..并确保将其发送给委托人,如下所示:

    if ([delegate conformsToProtocol:@protocol(MyPopoverDelegate)]) {
       if ([delegate respondsToSelector:@selector(didClickCancelButton:)]) {
           [delegate didClickCancelButton:selectedWineStyle];
       }
    }
    

    关于 Popover 未被解除,请确保存储对 UIPopoverController 的引用并简单地调用:

    - (void)didClickCancelButton:(WineStyle)wineStyle {
       // ... do something with "wineStyle" here
       [currentPopover dismissPopoverAnimated:YES];
    }
    

    【讨论】:

    • 感谢您的评论,但不幸的是,当我点击弹出窗口上的按钮时,-(void)didClickCancelButton 没有被正确调用。因此,我的问题摆在首位。我想一旦我可以调用didClickCancelButton,那么传递变量会容易得多。
    【解决方案4】:

    您需要告诉弹出框控制器要拥有什么弹出框,您没有这样做。我不确定你是如何表达你的观点的,但你应该有类似的东西

       UIPopoverController paparazzi = [[UIPopoverController alloc] initWithContentViewController:temp];
    

    【讨论】:

    • 感谢您的评论,但我不知道这行代码属于哪里。
    【解决方案5】:

    本教程确实帮助我解决了类似的问题: http://ios.biomsoft.com/2011/10/17/beginning-storyboards-in-ios-5-part-2/

    【讨论】:

    • 感谢您的评论,但该教程与弹出视图无关。
    • 它可能不是“弹出框”,但要注意 segue/delegate 部分以及如何来回传递信息。
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2012-11-07
    • 2013-02-08
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多