日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

segue和delegate实现两个页面传值

發布時間:2024/4/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 segue和delegate实现两个页面传值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

頁面傳值

如果有兩個頁面A和B之前需要傳值,如下圖所示,從A頁面打開一個B頁面,填入一些信息后,展現在B頁面。這個過程需要從B頁面傳數據給A頁面。

A->B的數據傳遞可以在segue中實現,B->A的數據傳遞則用delegate。下面分別講述這兩種傳值方式。


.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
{
?[
super?viewDidLoad];
?self.titleTextField.text=self.defaultTitleValue;
?self.priceTextField.text=self.defaultPriceValue;

}

? ? 運行,當跳轉到第二個頁面時,textfield中被填充了默認值 。



二、delegate傳值

?????由于segue是單向的由A到B,那么在segue中怎么把B中產生的data傳遞給A。從頁面B傳值給A,單純用segue難以實現。我們使用ios中一個很重要的模式,delegate。

? ?

???delegate的出現與mvc(model-view-controller),protocol密切相關。?下面講述使用delegate進行傳值的思路。

一般情況下,我們會想到傳一個A指針給B,當B產生了數據后,再調用A的設置方法就可以了。因此,在B中設置一個delegate屬性,把它賦值為A,就可以實現上述思路。但是這并不是delegate的真相。

? ? delegate與protocol密切相關,可以類似的理解為java中的interface。有了這一含義之后,delegate可以做的事情更多。例如有兩個頁面。可以共用一個B頁面進行寶貝詳情的編輯,編輯好后,返回A1或A2都可以,只要它們都實現了PassValueDelegate協議,然后B的delegate屬性設置為實現了PassValueDelegate協議的類。

?

更多信息參考:delegate和protocol

?

下面介紹實現過程:

1.新建一個PassValueDelegate類,并在PassValueDelegate.h中聲明一個protocol,代碼如下。

PassValueDelegate Protocol中聲明了一個setValue方法,繼承此協議的類需要實現此方法。

#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中實現PassValueDelegate聲明的方法。

#pragma mark passValueDelegate
?-(void)setValue:(NSDictionary?*)dictionary{
?self.titleLabel.text=[dictionary?objectForKey:@"titleValue"];
?self.priceLabel.text=[dictionary?objectForKey:@"priceValue"];
}

#pragma mark end


5.將第二個頁面的確定按鈕關聯一個IBAction



并在自動生成的passValue代碼中實現setValue方法的調用。


- (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.運行,在編輯頁面中輸入信息,點擊確定后,在第一個頁面中展示。



?


轉載于:https://blog.51cto.com/9299041/1550637

總結

以上是生活随笔為你收集整理的segue和delegate实现两个页面传值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。