中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS中如何實現頁面傳值

發布時間:2021-07-07 12:49:08 來源:億速云 閱讀:162 作者:小新 欄目:移動開發

小編給大家分享一下iOS中如何實現頁面傳值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

代理協議傳值

順傳

假設A為第一個視圖控制器,B為第二個視圖控制器

在A中導入B的.h文件

場景:A向B傳值

第一步:在B的.h中定義一個content屬性

@interface SecondViewController : UIViewController
@property(nonatomic,copy)NSString *contents;
@end

第二步:在點擊A中的按鈕方法里面給B的content屬性賦值

- (void)buttonAction:(UIButton *)button
 {
 NSLog(@"進入第二頁");
 SecondViewController *secondVC = [SecondViewController alloc] init];
 secondVC.contents = self.label.text;
 [self.navigationController pushViewController:secondVC animated:YES];
 }

第三部:在B使用content的屬性給相應的控件賦值

@implemention SecondViewController
- (void)viewDidLoad {
 [super viewDidLoad];
 self.view.backgroundColor = [UIColor whiteColor];
 self.navigationItem.title = self.contents;
 }

逆傳

代理傳值使用在兩個界面傳值的之后,從后向前傳值。

假設A為第一個視圖控制器,B為第二個視圖控制器

場景:B向A傳值

第一步:首先在B的.h文件中聲明協議和協議方法

第二步:在B的.h中聲明一個代理屬性,這里主要注意用assign或weak修飾,weak和assign是一種非擁有關系的指針,通過這兩種修飾符修飾的指針變量,都不會改變被引用的對象的引用計數。但是在一個對象被釋放后,weak會自動將指針指向nil,而assign則不會。所以,用weak更安全些。

@property (nonatomic,weak)id<協議名>delegate;

#pragma mark 這里是B的.h
#import<UIKit/UIKit.h>
@protocol CsutomTabBarDelegate<NSObject>
// 把btn的tag傳出去的方法
- (void)selectedIndexWithTag:(NSInteger)tag;
@end
@interface CustomTabBarView : UIView
//聲明一個代理屬性delegate
@property (nonatomic,weak)id<CsutomTabBarDelegate>delegate;
@end

第三部:在B即將POP回前一個界面的時候,在pop方法的上一行使用協議方法傳遞數據[self.delegate 協議方法名:(參數,也就是要傳回的數據)

#pragma mark 這里是B的.m
// 判斷在制定的代理類中是否實現了該協議方法
// 確保執行時無此方法時不崩潰
if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)])
{
 // 執行代理方法
 [self.delegate selectedIndexWithTag:(sender.tag - 1000)];
}
else
{
 NSLog(@"協議中的方法沒有實現");
}

在A的.m中,在push到B界面方法之前,B對象的初始化之后,指定A對象為B對象的代理(B對象).delegate = self此時會有黃色警告,因為沒有準守協議

#pragma mark A的.m中
// 指定代理,B就是customView
customView .delegate = self;

第五步:在A的延展或者A的.h文件中導入協議名稱<協議名稱>

#pragma mark A的.m的延展里,A就是RootTabBarController
// 協議導入
@interface RootTabBarController () <CustomTabBarDelegate>
@end

第六步:在A的.m中事項協議方法,取得參數中得知,呈現在當前界面上

#pragma mark A的.m
// 實現代理方法,這里就可以使用從B傳來的值了
- (void)selectedIndexWithTag:(NSIngeter)tag
 {
  self.selectedIndex = tag;
 }

使用Block頁面間傳值

第一步:在B的.h中重定義一個block,用這個重定義的block類型聲明一個類的屬性這里要注意用copy修飾block屬性

#pragma mark B的.h 
#import <UIKit/UIKit.h> 
// block傳值 
// 重命名一個有參無返回值的block類型 
typedef void(^passValue)(NSInteger tag); 
@interface CustomTabBarView : UIView 
 //用這個block類型定義一個屬性 
@property (nonatomic,copy)passValue passValueTag; 
@end

第二步:在B的.m的返回方法中調用block的方法

#pragma mark B的.m的返回方法中 
//調用block方法 
self.passValueTag(sender.tag - 1000);

第三步:在A的.m中創建B的實例的地方,為B的block屬性賦值,也就是說,寫好這個block中的內容,類似于給B的某一個屬性賦初值

// 設置block內容 
 customView.passValueTag = ^(NSInteger tag) 
 { 
  self.selectedIndex = tag; 
 };

沒有引用局部變量的Block內存存儲在全局區

引用了局部變量的Block內存存儲在棧區

當對Block進行copy操作的時候Block的內存存在堆區

Block的循環引用問題

當Block是self的一個屬性的時候

self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};

會導致self的引用計數+1,最終導致循環引用

在ARC下使用weak修飾變量防止循環引用

在非ARC下使用block修飾變量防止循環引用

以上是“iOS中如何實現頁面傳值”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

历史| 玉环县| 福建省| 昆明市| 九龙坡区| 弥勒县| 大名县| 临夏市| 巴里| 台中市| 山丹县| 遂昌县| 中宁县| 长乐市| 武安市| 巢湖市| 长武县| 白山市| 安义县| 广河县| 临夏县| 繁昌县| 甘孜| 黑龙江省| 洛川县| 喀什市| 肇庆市| 扎兰屯市| 涟水县| 利川市| 绥宁县| 九龙坡区| 日照市| 南安市| 阜新| 靖西县| 会同县| 临江市| 油尖旺区| 玉林市| 左云县|