两个页面之间传参数(包括单例模式,sugue,tableView,代理模式)

来源:互联网 发布:淘宝开店钱盾认证 编辑:程序博客网 时间:2024/05/17 12:20

单例模式可以用来在两个页面之间传参数

下面是Objective-C中完整的单例类的实现:

Singleton.h

#import<Foundation/Foundation.h>


@interface Singleton : NSObject


+(id)shareInstance;


@end



Singleton.m

#import "Singleton.h"

static Singleton * instance = nil;

@implementation Singleton


+(id)shareInstance

{

    if(instance == nil)

    {

        instance = [[[self class]alloc]init];             

    }

    return instance;

}


+(id)allocWithZone:(NSZone *)zone

{

     if(instance == nil)
     {
         instance = [super allocWithZone:zone];
         
     }   

    return instance;  

}


页面传值


segue传值

新建一个Single View应用,并在stroyboard中拖入一个viewController.并添加相应的控件,如下图所示,然后建立“编辑”按钮到页面2的model segue.

新建一个SecondViewController类,与第一个页面绑定,并关联标题和价格的textField属性。它将接收第一个页面传过来的默认值。

 

在第一个页面中,关联标题和价格的内容label属性。并给它们设置一个默认值。如下图所示。

     在TestViewController.m中重写prepareForSegue方法,将默认值传给第二个页面。

 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
 UIViewController *viewController=segue.destinationViewController;
 SecondViewController *secondViewController=(SecondViewController *)viewController;
 secondViewController.
defaultTitleValue=self.titleLabel.text;
 secondViewController.
defaultPriceValue=self.priceLabel.text;

}

    在SecondViewController.m的viewDidload方法中加入两条赋值语句,如下所示。


- (void)viewDidLoad
{
 [
superviewDidLoad];
 self.titleTextField.text=self.defaultTitleValue;
 self.priceTextField.text=self.defaultPriceValue;

}

    运行,当跳转到第二个页面时,textfield中被填充了默认值 。


补充:tableView利用segue传值




通过Delegate来传值

比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。

1、首先定义个一委托UIViewPassValueDelegate用来传递值

@protocol UIViewPassValueDelegate  - (void)passValue:(NSString *)value;  @end 

这个protocol 就是用来传递值

2、在窗口1的头文件里,声明delegate

复制代码
复制代码
#import <UIKit/UIKit.h> #import "UIViewPassValueDelegate.h"  @interface DelegateSampleViewController : UIViewController <UIViewPassValueDelegate> {      UITextField *_value;  }  @property(nonatomic, retain) IBOutlet UITextField *value;  - (IBAction)buttonClick:(id)sender;  @end 
复制代码
复制代码

并实现这个委托

- (void)passValue:(NSString *)value  {    self.value.text = value;      NSLog(@"the get value is %@", value);  } 

button的Click方法,打开窗口2,并将窗口2的delegate实现方法指向窗口1。

复制代码
复制代码
- (IBAction)buttonClick:(id)sender  {      ValueInputView *valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView" bundle:[NSBundle mainBundle]];      valueView.delegate = self;      [self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];      [self presentModalViewController:valueView animated:YES];  } 
复制代码
复制代码

第二个窗口的实现

.h 头文件

复制代码
复制代码
#import <UIKit/UIKit.h> #import "UIViewPassValueDelegate.h"   @interface ValueInputView : UIViewController {       NSObject<UIViewPassValueDelegate> * delegate;      UITextField *_value;  }  @property(nonatomic, retain)IBOutlet UITextField *value;  @property(nonatomic, retain) NSObject<UIViewPassValueDelegate> * delegate;  - (IBAction)buttonClick:(id)sender;  @end 
复制代码
复制代码

.m实现文件

复制代码
复制代码
#import "ValueInputView.h"  @implementation ValueInputView  @synthesize delegate;  @synthesize value = _value;  - (void)dealloc {      [self.value release];      [super dealloc];  }   - (IBAction)buttonClick:(id)sender  {      [delegate passValue:self.value.text];      NSLog(@"self.value.text is%@", self.value.text);      [self dismissModalViewControllerAnimated:YES];           }  - (void)didReceiveMemoryWarning {      // Releases the view if it doesn't have a superview.      [super didReceiveMemoryWarning];            // Release any cached data, images, etc. that aren't in use.  }   - (void)viewDidUnload {      [super viewDidUnload];      // Release any retained subviews of the main view.      // e.g. self.myOutlet = nil;  }    @end 



0 0
原创粉丝点击