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

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

下面是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 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值