繼承前一篇的做法,Popover使用Button去做Dismiss的動作
在iPad的實作上,Popover是經常使用的一個顯示方式,而要回到主視窗時,除了使用手勢點及主視窗外,應該也要支援Button回去的方法,以下是實作的方法。
資料參考
http://www.colejoplin.com/2012/09/12/ios-tutorial-combining-delegation-storyboards-popovers-and-data/
實作步驟
1. 開啓一個專案
2. 在sotryboard加入一個新的UIViewController,並在兩個UIViewController,個別加上一個Button及一個TextField
3. 加入新的UIViewController的class檔案,命名為popoverViewControlller
4.對Segue命名為segPop
5. 因為要用Delegate,所以要先從popoverViewController.h開始
#import <UIKit/UIKit.h>
@protocol PopViewControllerDelegate; // Declare a protocol name
@interface popoverViewController : UIViewController
// Declare a property for the delegate
@property (weak) id <PopViewControllerDelegate> delegate;
// Declare a properly where a delegate can send data to this class
@property (strong, nonatomic) NSString *strPassedValue;
@property (weak, nonatomic) IBOutlet UITextField *popoverTextField;
@property (weak, nonatomic) IBOutlet UIButton *popoverButton;
@end
// Protocol Header
@protocol PopViewControllerDelegate <NSObject>
@required
- (void)dismissPop:(NSString *)value;
@end
6. 針對popoverViewController.m的內容作coding
#import "popoverViewController.h"
@implementation popoverViewController
@synthesize popoverButton,popoverTextField;
// getter/setter for header properties
@synthesize delegate;
@synthesize strPassedValue;
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
// 把主視窗傳來的值顯示出來
[popoverTextField setText:strPassedValue];
}
- (IBAction)goBack:(id)sender {
// 把值傳回主視窗,呼叫主視窗的dismissPop
[delegate dismissPop:[popoverTextField text]]; // make delegate callback here
}
@end
7. 把delegate的變數套到mainViewControlller.h
#import <UIKit/UIKit.h>
#import "popoverViewController.h" // add header to gain access to its protocol
@interface mainViewController : UIViewController <PopViewControllerDelegate, UIPopoverControllerDelegate>
@property (weak, nonatomic) IBOutlet UIButton *popBautton;
@property (weak, nonatomic) IBOutlet UITextField *mainTextField;
// Properties for accessing the popover and its viewcontroller
@property (strong, nonatomic) UIStoryboardPopoverSegue *currentPopoverSegue;
@property (strong, nonatomic) popoverViewController *pvc;
@end
8. 設定
#import "mainViewController.h"
@interface mainViewController ()
@end
@implementation mainViewController
@synthesize popBautton;
@synthesize mainTextField;
// getter/setter for popover properties
@synthesize currentPopoverSegue;
@synthesize pvc;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//啟動popover視窗
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"segPop"]) {
currentPopoverSegue = (UIStoryboardPopoverSegue *)segue;
pvc = [segue destinationViewController]; //設定popover
[pvc setDelegate:self];
//將值傳送到popover視窗,透過setStrPassedValue這個內定Function傳送NSString
[pvc setStrPassedValue:[mainTextField text]];
}
}
// PopViewControllerDelegate callback function
- (void)dismissPop:(NSString *)value {
[mainTextField setText:value]; // populates data from popover
// dismiss the popover
[[currentPopoverSegue popoverController] dismissPopoverAnimated: YES];
}
@end
9.執行結果,兩個UIView可互相傳遞字串







