詳解iOS頁(yè)面?zhèn)髦担槀?逆?zhèn)鳎?/h1>
更新時(shí)間:2017年01月16日 16:51:23 作者:當(dāng)黑夜愛上陽(yáng)光。
本文主要介紹了iOS頁(yè)面?zhèn)髦担槀?逆?zhèn)鳎┑姆椒ā>哂幸欢ǖ膮⒖純r(jià)值,下面跟著小編一起來看下吧
代理協(xié)議傳值
順傳
假設(shè)A為第一個(gè)視圖控制器,B為第二個(gè)視圖控制器
在A中導(dǎo)入B的.h文件
場(chǎng)景:A向B傳值
第一步:在B的.h中定義一個(gè)content屬性
@interface SecondViewController : UIViewController
@property(nonatomic,copy)NSString *contents;
@end
第二步:在點(diǎn)擊A中的按鈕方法里面給B的content屬性賦值
- (void)buttonAction:(UIButton *)button
{
NSLog(@"進(jìn)入第二頁(yè)");
SecondViewController *secondVC = [SecondViewController alloc] init];
secondVC.contents = self.label.text;
[self.navigationController pushViewController:secondVC animated:YES];
}
第三部:在B使用content的屬性給相應(yīng)的控件賦值
@implemention SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = self.contents;
}
逆?zhèn)?/strong>
代理傳值使用在兩個(gè)界面?zhèn)髦档闹?,從后向前傳值?/p>
假設(shè)A為第一個(gè)視圖控制器,B為第二個(gè)視圖控制器
場(chǎng)景:B向A傳值
第一步:首先在B的.h文件中聲明協(xié)議和協(xié)議方法
第二步:在B的.h中聲明一個(gè)代理屬性,這里主要注意用assign或weak修飾,weak和assign是一種非擁有關(guān)系的指針,通過這兩種修飾符修飾的指針變量,都不會(huì)改變被引用的對(duì)象的引用計(jì)數(shù)。但是在一個(gè)對(duì)象被釋放后,weak會(huì)自動(dòng)將指針指向nil,而assign則不會(huì)。所以,用weak更安全些。
@property (nonatomic,weak)id<協(xié)議名>delegate;
#pragma mark 這里是B的.h
#import<UIKit/UIKit.h>
@protocol CsutomTabBarDelegate<NSObject>
// 把btn的tag傳出去的方法
- (void)selectedIndexWithTag:(NSInteger)tag;
@end
@interface CustomTabBarView : UIView
//聲明一個(gè)代理屬性delegate
@property (nonatomic,weak)id<CsutomTabBarDelegate>delegate;
@end
第三部:在B即將POP回前一個(gè)界面的時(shí)候,在pop方法的上一行使用協(xié)議方法傳遞數(shù)據(jù)[self.delegate 協(xié)議方法名:(參數(shù),也就是要傳回的數(shù)據(jù))
#pragma mark 這里是B的.m
// 判斷在制定的代理類中是否實(shí)現(xiàn)了該協(xié)議方法
// 確保執(zhí)行時(shí)無此方法時(shí)不崩潰
if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)])
{
// 執(zhí)行代理方法
[self.delegate selectedIndexWithTag:(sender.tag - 1000)];
}
else
{
NSLog(@"協(xié)議中的方法沒有實(shí)現(xiàn)");
}
在A的.m中,在push到B界面方法之前,B對(duì)象的初始化之后,指定A對(duì)象為B對(duì)象的代理(B對(duì)象).delegate = self此時(shí)會(huì)有黃色警告,因?yàn)闆]有準(zhǔn)守協(xié)議
#pragma mark A的.m中
// 指定代理,B就是customView
customView .delegate = self;
第五步:在A的延展或者A的.h文件中導(dǎo)入?yún)f(xié)議名稱<協(xié)議名稱>
#pragma mark A的.m的延展里,A就是RootTabBarController
// 協(xié)議導(dǎo)入
@interface RootTabBarController () <CustomTabBarDelegate>
@end
第六步:在A的.m中事項(xiàng)協(xié)議方法,取得參數(shù)中得知,呈現(xiàn)在當(dāng)前界面上
#pragma mark A的.m
// 實(shí)現(xiàn)代理方法,這里就可以使用從B傳來的值了
- (void)selectedIndexWithTag:(NSIngeter)tag
{
self.selectedIndex = tag;
}
使用Block頁(yè)面間傳值
第一步:在B的.h中重定義一個(gè)block,用這個(gè)重定義的block類型聲明一個(gè)類的屬性這里要注意用copy修飾block屬性
#pragma mark B的.h
#import <UIKit/UIKit.h>
// block傳值
// 重命名一個(gè)有參無返回值的block類型
typedef void(^passValue)(NSInteger tag);
@interface CustomTabBarView : UIView
//用這個(gè)block類型定義一個(gè)屬性
@property (nonatomic,copy)passValue passValueTag;
@end
第二步:在B的.m的返回方法中調(diào)用block的方法
#pragma mark B的.m的返回方法中
//調(diào)用block方法
self.passValueTag(sender.tag - 1000);
第三步:在A的.m中創(chuàng)建B的實(shí)例的地方,為B的block屬性賦值,也就是說,寫好這個(gè)block中的內(nèi)容,類似于給B的某一個(gè)屬性賦初值
// 設(shè)置block內(nèi)容
customView.passValueTag = ^(NSInteger tag)
{
self.selectedIndex = tag;
};
沒有引用局部變量的Block內(nèi)存存儲(chǔ)在全局區(qū)
引用了局部變量的Block內(nèi)存存儲(chǔ)在棧區(qū)
當(dāng)對(duì)Block進(jìn)行copy操作的時(shí)候Block的內(nèi)存存在堆區(qū)
Block的循環(huán)引用問題
當(dāng)Block是self的一個(gè)屬性的時(shí)候
self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};
會(huì)導(dǎo)致self的引用計(jì)數(shù)+1,最終導(dǎo)致循環(huán)引用
在ARC下使用weak修飾變量防止循環(huán)引用
在非ARC下使用block修飾變量防止循環(huán)引用
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
-
解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法
這篇文章主要介紹了解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下 2016-01-01
-
ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片
這篇文章主要介紹了ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片的相關(guān)資料,非常具有實(shí)用價(jià)值,需要的朋友可以參考下 2017-06-06
-
iOS之?dāng)?shù)據(jù)解析之XML解析詳解
本篇文章主要介紹了iOS之?dāng)?shù)據(jù)解析之XML解析詳解,XML解析常見的兩種方式:DOM解析和SAX解析,有興趣的可以了解一下。 2016-12-12
-
淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表
這篇文章主要介紹了淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表,本文詳細(xì)的介紹了單鏈表和雙鏈表,具有一定的參考價(jià)值,有興趣的可以了解一下 2017-09-09
-
iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法
本篇文章主要介紹了iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
2017-05-05
-
阿里數(shù)據(jù)iOS端啟動(dòng)速度優(yōu)化心得
本篇文章給大家詳細(xì)分析了阿里數(shù)據(jù)iOS端啟動(dòng)速度優(yōu)化的知識(shí)點(diǎn)以及心得,對(duì)此有興趣的朋友參考學(xué)習(xí)下吧。 2018-02-02
-
詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式
這篇文章主要介紹了詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式,文中示例基于Objective-C語(yǔ)言,需要的朋友可以參考下 2016-02-02
-
iOS touch事件區(qū)分單擊雙擊響應(yīng)的方法
如果您的 iPhone 應(yīng)用里有個(gè) view,既有單擊操作又有雙擊操作。用戶雙擊 view 時(shí),總是先執(zhí)行一遍單擊的操作再執(zhí)行雙擊的操作。所以直接判斷時(shí)就會(huì)發(fā)現(xiàn)不能直接進(jìn)入雙擊操作。下面是區(qū)分 touch 事件是單擊還是雙擊的方法,需要的朋友可以參考下 2016-10-10
最新評(píng)論
代理協(xié)議傳值
順傳
假設(shè)A為第一個(gè)視圖控制器,B為第二個(gè)視圖控制器
在A中導(dǎo)入B的.h文件
場(chǎng)景:A向B傳值
第一步:在B的.h中定義一個(gè)content屬性
@interface SecondViewController : UIViewController @property(nonatomic,copy)NSString *contents; @end
第二步:在點(diǎn)擊A中的按鈕方法里面給B的content屬性賦值
- (void)buttonAction:(UIButton *)button { NSLog(@"進(jìn)入第二頁(yè)"); SecondViewController *secondVC = [SecondViewController alloc] init]; secondVC.contents = self.label.text; [self.navigationController pushViewController:secondVC animated:YES]; }
第三部:在B使用content的屬性給相應(yīng)的控件賦值
@implemention SecondViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.navigationItem.title = self.contents; }
逆?zhèn)?/strong>
代理傳值使用在兩個(gè)界面?zhèn)髦档闹?,從后向前傳值?/p>
假設(shè)A為第一個(gè)視圖控制器,B為第二個(gè)視圖控制器
場(chǎng)景:B向A傳值
第一步:首先在B的.h文件中聲明協(xié)議和協(xié)議方法
第二步:在B的.h中聲明一個(gè)代理屬性,這里主要注意用assign或weak修飾,weak和assign是一種非擁有關(guān)系的指針,通過這兩種修飾符修飾的指針變量,都不會(huì)改變被引用的對(duì)象的引用計(jì)數(shù)。但是在一個(gè)對(duì)象被釋放后,weak會(huì)自動(dòng)將指針指向nil,而assign則不會(huì)。所以,用weak更安全些。
@property (nonatomic,weak)id<協(xié)議名>delegate;
#pragma mark 這里是B的.h #import<UIKit/UIKit.h> @protocol CsutomTabBarDelegate<NSObject> // 把btn的tag傳出去的方法 - (void)selectedIndexWithTag:(NSInteger)tag; @end @interface CustomTabBarView : UIView //聲明一個(gè)代理屬性delegate @property (nonatomic,weak)id<CsutomTabBarDelegate>delegate; @end
第三部:在B即將POP回前一個(gè)界面的時(shí)候,在pop方法的上一行使用協(xié)議方法傳遞數(shù)據(jù)[self.delegate 協(xié)議方法名:(參數(shù),也就是要傳回的數(shù)據(jù))
#pragma mark 這里是B的.m // 判斷在制定的代理類中是否實(shí)現(xiàn)了該協(xié)議方法 // 確保執(zhí)行時(shí)無此方法時(shí)不崩潰 if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)]) { // 執(zhí)行代理方法 [self.delegate selectedIndexWithTag:(sender.tag - 1000)]; } else { NSLog(@"協(xié)議中的方法沒有實(shí)現(xiàn)"); }
在A的.m中,在push到B界面方法之前,B對(duì)象的初始化之后,指定A對(duì)象為B對(duì)象的代理(B對(duì)象).delegate = self此時(shí)會(huì)有黃色警告,因?yàn)闆]有準(zhǔn)守協(xié)議
#pragma mark A的.m中 // 指定代理,B就是customView customView .delegate = self;
第五步:在A的延展或者A的.h文件中導(dǎo)入?yún)f(xié)議名稱<協(xié)議名稱>
#pragma mark A的.m的延展里,A就是RootTabBarController // 協(xié)議導(dǎo)入 @interface RootTabBarController () <CustomTabBarDelegate> @end
第六步:在A的.m中事項(xiàng)協(xié)議方法,取得參數(shù)中得知,呈現(xiàn)在當(dāng)前界面上
#pragma mark A的.m // 實(shí)現(xiàn)代理方法,這里就可以使用從B傳來的值了 - (void)selectedIndexWithTag:(NSIngeter)tag { self.selectedIndex = tag; }
使用Block頁(yè)面間傳值
第一步:在B的.h中重定義一個(gè)block,用這個(gè)重定義的block類型聲明一個(gè)類的屬性這里要注意用copy修飾block屬性
#pragma mark B的.h #import <UIKit/UIKit.h> // block傳值 // 重命名一個(gè)有參無返回值的block類型 typedef void(^passValue)(NSInteger tag); @interface CustomTabBarView : UIView //用這個(gè)block類型定義一個(gè)屬性 @property (nonatomic,copy)passValue passValueTag; @end
第二步:在B的.m的返回方法中調(diào)用block的方法
#pragma mark B的.m的返回方法中 //調(diào)用block方法 self.passValueTag(sender.tag - 1000);
第三步:在A的.m中創(chuàng)建B的實(shí)例的地方,為B的block屬性賦值,也就是說,寫好這個(gè)block中的內(nèi)容,類似于給B的某一個(gè)屬性賦初值
// 設(shè)置block內(nèi)容 customView.passValueTag = ^(NSInteger tag) { self.selectedIndex = tag; };
沒有引用局部變量的Block內(nèi)存存儲(chǔ)在全局區(qū)
引用了局部變量的Block內(nèi)存存儲(chǔ)在棧區(qū)
當(dāng)對(duì)Block進(jìn)行copy操作的時(shí)候Block的內(nèi)存存在堆區(qū)
Block的循環(huán)引用問題
當(dāng)Block是self的一個(gè)屬性的時(shí)候
self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};
會(huì)導(dǎo)致self的引用計(jì)數(shù)+1,最終導(dǎo)致循環(huán)引用
在ARC下使用weak修飾變量防止循環(huán)引用
在非ARC下使用block修飾變量防止循環(huán)引用
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法
這篇文章主要介紹了解析iOS應(yīng)用的UI開發(fā)中懶加載和xib的簡(jiǎn)單使用方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片
這篇文章主要介紹了ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片的相關(guān)資料,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06iOS之?dāng)?shù)據(jù)解析之XML解析詳解
本篇文章主要介紹了iOS之?dāng)?shù)據(jù)解析之XML解析詳解,XML解析常見的兩種方式:DOM解析和SAX解析,有興趣的可以了解一下。2016-12-12淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表
這篇文章主要介紹了淺談iOS 數(shù)據(jù)結(jié)構(gòu)之鏈表,本文詳細(xì)的介紹了單鏈表和雙鏈表,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法
本篇文章主要介紹了iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05阿里數(shù)據(jù)iOS端啟動(dòng)速度優(yōu)化心得
本篇文章給大家詳細(xì)分析了阿里數(shù)據(jù)iOS端啟動(dòng)速度優(yōu)化的知識(shí)點(diǎn)以及心得,對(duì)此有興趣的朋友參考學(xué)習(xí)下吧。2018-02-02詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式
這篇文章主要介紹了詳解iOS應(yīng)用開發(fā)中的ARC內(nèi)存管理方式,文中示例基于Objective-C語(yǔ)言,需要的朋友可以參考下2016-02-02iOS touch事件區(qū)分單擊雙擊響應(yīng)的方法
如果您的 iPhone 應(yīng)用里有個(gè) view,既有單擊操作又有雙擊操作。用戶雙擊 view 時(shí),總是先執(zhí)行一遍單擊的操作再執(zhí)行雙擊的操作。所以直接判斷時(shí)就會(huì)發(fā)現(xiàn)不能直接進(jìn)入雙擊操作。下面是區(qū)分 touch 事件是單擊還是雙擊的方法,需要的朋友可以參考下2016-10-10