2012年11月18日 星期日

Popover在iPad上的使用(二)

繼承前一篇的做法,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可互相傳遞字串