segue和delegate实现两个页面传值
頁面?zhèn)髦?/span>
如果有兩個頁面A和B之前需要傳值,如下圖所示,從A頁面打開一個B頁面,填入一些信息后,展現(xiàn)在B頁面。這個過程需要從B頁面?zhèn)鲾?shù)據(jù)給A頁面。
A->B的數(shù)據(jù)傳遞可以在segue中實現(xiàn),B->A的數(shù)據(jù)傳遞則用delegate。下面分別講述這兩種傳值方式。
一.segue傳值
新建一個Single View應(yīng)用,并在stroyboard中拖入一個viewController.并添加相應(yīng)的控件,如下圖所示,然后建立“編輯”按鈕到頁面2的model segue.
新建一個SecondViewController類,與第一個頁面綁定,并關(guān)聯(lián)標(biāo)題和價格的textField屬性。它將接收第一個頁面?zhèn)鬟^來的默認(rèn)值。
?
在第一個頁面中,關(guān)聯(lián)標(biāo)題和價格的內(nèi)容label屬性。并給它們設(shè)置一個默認(rèn)值。如下圖所示。
? ? ?在TestViewController.m中重寫prepareForSegue方法,將默認(rèn)值傳給第二個頁面。
?
-(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
{
?[super?viewDidLoad];
?self.titleTextField.text=self.defaultTitleValue;
?self.priceTextField.text=self.defaultPriceValue;
}
? ? 運行,當(dāng)跳轉(zhuǎn)到第二個頁面時,textfield中被填充了默認(rèn)值 。
二、delegate傳值
?????由于segue是單向的由A到B,那么在segue中怎么把B中產(chǎn)生的data傳遞給A。從頁面B傳值給A,單純用segue難以實現(xiàn)。我們使用ios中一個很重要的模式,delegate。
? ?
???delegate的出現(xiàn)與mvc(model-view-controller),protocol密切相關(guān)。?下面講述使用delegate進行傳值的思路。
一般情況下,我們會想到傳一個A指針給B,當(dāng)B產(chǎn)生了數(shù)據(jù)后,再調(diào)用A的設(shè)置方法就可以了。因此,在B中設(shè)置一個delegate屬性,把它賦值為A,就可以實現(xiàn)上述思路。但是這并不是delegate的真相。
? ? delegate與protocol密切相關(guān),可以類似的理解為java中的interface。有了這一含義之后,delegate可以做的事情更多。例如有兩個頁面。可以共用一個B頁面進行寶貝詳情的編輯,編輯好后,返回A1或A2都可以,只要它們都實現(xiàn)了PassValueDelegate協(xié)議,然后B的delegate屬性設(shè)置為實現(xiàn)了PassValueDelegate協(xié)議的類。
?
更多信息參考:delegate和protocol
?
下面介紹實現(xiàn)過程:
1.新建一個PassValueDelegate類,并在PassValueDelegate.h中聲明一個protocol,代碼如下。
PassValueDelegate Protocol中聲明了一個setValue方法,繼承此協(xié)議的類需要實現(xiàn)此方法。
#import?<Foundation/Foundation.h>
@protocol?PassValueDelegate <NSObject>
?-(void)setValue:(NSDictionary?*)dictionary;
@end
@interface?PassValueDelegate :?NSObject
@end
2.在TestViewController繼承PassValueDelegate,代碼如下
#import?<UIKit/UIKit.h>
#import?"PassValueDelegate.h"
@interface?TestViewController :?UIViewController<PassValueDelegate>
.......
3.在SecondViewController中聲明一個Delegate屬性,它是繼承了PassValueDelegate的對象
4.在TestViewController.m中實現(xiàn)PassValueDelegate聲明的方法。
#pragma mark passValueDelegate
?-(void)setValue:(NSDictionary?*)dictionary{
?self.titleLabel.text=[dictionary?objectForKey:@"titleValue"];
?self.priceLabel.text=[dictionary?objectForKey:@"priceValue"];
}
#pragma mark end
5.將第二個頁面的確定按鈕關(guān)聯(lián)一個IBAction
并在自動生成的passValue代碼中實現(xiàn)setValue方法的調(diào)用。
- (IBAction)passValue:(id)sender {
? NSDictionary?*dictionary=[NSDictionary ?dictionaryWithObjectsAndKeys:self.titleTextField.text,@"titleValue",self.priceTextField.text,@"priceValue",nil];
? [self.delegate?setValue:dictionary];
? [self?dismissViewControllerAnimated:YES?completion:nil];
}
6.delegate賦值,在prepareForSegue方法中加入delegate賦值語句,代碼如下
-(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;
//delegate賦值
? secondViewController.delegate=self;
}
7.運行,在編輯頁面中輸入信息,點擊確定后,在第一個頁面中展示。
?
轉(zhuǎn)載于:https://blog.51cto.com/9299041/1550637
總結(jié)
以上是生活随笔為你收集整理的segue和delegate实现两个页面传值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。