Ios7 故事板中多个弹出框的最佳模式

Ios7 故事板中多个弹出框的最佳模式,ios7,uistoryboard,uistoryboardsegue,Ios7,Uistoryboard,Uistoryboardsegue,我正在编写一个iPad应用程序,它将有几个按钮,当点击打开一个弹出窗口到一个桌面视图。用户将选择一个值,弹出框将被取消,按钮的标题将更改 我用一个Popover制作了这个,然后想再添加一个。我想写一些好的、干净的可重用代码 我最大的障碍是代表们。应该有多少?每件府绸都应该有自己的 根视图控制器头 #import <UIKit/UIKit.h> #import "PopViewController1.h" #import "PopViewControlle

我正在编写一个iPad应用程序,它将有几个按钮,当点击打开一个弹出窗口到一个桌面视图。用户将选择一个值,弹出框将被取消,按钮的标题将更改

我用一个Popover制作了这个,然后想再添加一个。我想写一些好的、干净的可重用代码

我最大的障碍是代表们。应该有多少?每件府绸都应该有自己的

根视图控制器头

#import <UIKit/UIKit.h>
#import "PopViewController1.h"
#import "PopViewController2.h"

@interface RootViewController : UIViewController <PopViewControllerDelegate,UIPopoverControllerDelegate>

// Properties for accessing the popover and its viewcontroller (1)
@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover1;
@property (strong, nonatomic) UIStoryboardPopoverSegue *pvcSegue1;
@property (strong, nonatomic) PopViewController1 *pvc1;

// Properties for accessing the popover and its viewcontroller (2)
@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover2;
@property (strong, nonatomic) UIStoryboardPopoverSegue *pvcSegue2;
@property (strong, nonatomic) PopViewController2 *pvc2;

@end
PopViewController1.h

#import <UIKit/UIKit.h>

@protocol PopViewControllerDelegate;

@interface PopViewController1 : UITableViewController

@property (weak) id <PopViewControllerDelegate> delegate;
@property (strong, nonatomic) NSString *strPassedValue;
@property (nonatomic, strong) NSMutableArray *importantChoices;

@end

@protocol PopViewControllerDelegate <NSObject>
@required
- (void)dismissPop:(NSString *)value;
@end
PopViewController2标题

#import <UIKit/UIKit.h>

@protocol PopViewControllerDelegate;

@interface PopViewController2 : UITableViewController

@property (weak) id <PopViewControllerDelegate> delegate;
@property (strong, nonatomic) NSString *strPassedValue2;
@property (nonatomic, strong) NSMutableArray *importantChoices2;

@end

@protocol PopViewControllerDelegate <NSObject>
@required
- (void)dismissPop2:(NSString *)value;
@end
任何帮助或建议都将不胜感激


Bryan

对于可重用代码,您只需要一个版本的
PopViewController
。你的两个版本看起来一模一样,所以去掉一个。在InterfaceBuilder中,将您的按钮设置为所有segue到单个PopViewController。因此,根视图控制器如下所示:

@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover1;
@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover2;
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    currentPopoverController = [segue destinationViewController];
    [currentPopoverController setDelegate:self];

    currentButton = (UIButton*) sender;
}
- (void)dismissPop:(NSString *)value {

    [currentButton setTitle:value forState:UIControlStateNormal];
    [currentPopoverController dismissPopoverAnimated:YES];
}
prepareforsgue:
中,不要切换到一个或另一个版本的
PopViewController
,只需切换到单个版本即可。将属性添加到根视图控制器以跟踪它(这将替换pvc1和pvc2):

您还需要跟踪正在编辑的按钮,因此为该按钮向根视图控制器添加一个属性(请注意弱引用):

prepareforsgue:
中设置这两个选项,使其看起来像这样:

@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover1;
@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover2;
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    currentPopoverController = [segue destinationViewController];
    [currentPopoverController setDelegate:self];

    currentButton = (UIButton*) sender;
}
- (void)dismissPop:(NSString *)value {

    [currentButton setTitle:value forState:UIControlStateNormal];
    [currentPopoverController dismissPopoverAnimated:YES];
}
现在,您只需要一个如下所示的委托:

@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover1;
@property (strong, nonatomic) IBOutlet UIButton *btnOpenPopover2;
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    currentPopoverController = [segue destinationViewController];
    [currentPopoverController setDelegate:self];

    currentButton = (UIButton*) sender;
}
- (void)dismissPop:(NSString *)value {

    [currentButton setTitle:value forState:UIControlStateNormal];
    [currentPopoverController dismissPopoverAnimated:YES];
}
我明白了

我需要在h文件中输入segue,将其设置为segue title,然后将segue属性添加到prepareforsgue方法中:

_segPopViewController = (UIStoryboardPopoverSegue *)segue;
最后,在代表中,我可以在这行中输入:

[[_segPopViewController popoverController] dismissPopoverAnimated: YES];
和成功

感谢原创海报-你帮了我很多!我希望我能给你投更多的票


布莱恩

除了一件小事之外,这一切都很好。当我选择一个值时,我无法使弹出框关闭。问题是上面代码的最后一行。我必须输入self.currentPopoverController[也用于currentButton],但这样我就不能被解雇。我所得到的一切都被解雇了。这可能是因为我嵌入了包含调用PopOver按钮的EmbeddedTableViewController。除了当用户选择一个选项时会被忽略之外,一切都很好。好的,有一个问题。我得到了要附加到popViewController的第一个按钮,但我不知道如何让第二个按钮具有该操作。现在单击第二个按钮时,根本没有任何操作。当我查看第一个按钮的连接检查器时,我会看到操作的弹出视图控制器。第二、第三和第四个按钮如何设置。