溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS中如何實(shí)現(xiàn)頁(yè)面?zhèn)髦?/h1>
發(fā)布時(shí)間:2021-07-07 12:49:08 來(lái)源:億速云 閱讀:161 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

小編給大家分享一下iOS中如何實(shí)現(xiàn)頁(yè)面?zhèn)髦?,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

代理協(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)系的指針,通過(guò)這兩種修飾符修飾的指針變量,都不會(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í)無(wú)此方法時(shí)不崩潰
if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)])
{
 // 執(zhí)行代理方法
 [self.delegate selectedIndexWithTag:(sender.tag - 1000)];
}
else
{
 NSLog(@"協(xié)議中的方法沒(méi)有實(shí)現(xiàn)");
}

在A的.m中,在push到B界面方法之前,B對(duì)象的初始化之后,指定A對(duì)象為B對(duì)象的代理(B對(duì)象).delegate = self此時(shí)會(huì)有黃色警告,因?yàn)闆](méi)有準(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傳來(lái)的值了
- (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è)有參無(wú)返回值的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屬性賦值,也就是說(shuō),寫好這個(gè)block中的內(nèi)容,類似于給B的某一個(gè)屬性賦初值

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

沒(méi)有引用局部變量的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)引用問(wè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)引用

以上是“iOS中如何實(shí)現(xiàn)頁(yè)面?zhèn)髦怠边@篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)
AI