[iOS开发]多界面传值之代理传值
Posted Billy Miracle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[iOS开发]多界面传值之代理传值相关的知识,希望对你有一定的参考价值。
代理传值一般用于第二个页面传值给第一个页面
FirstViewController页面push到SecondViewController页面,如果SecondViewController页面的信息想回传到FirstViewController页面,用代理传值,其中SecondViewController定义协议和声明代理,FirstViewController确认并实现代理,FirstViewController作为SecondViewController的代理。
举例有两个View Controller,ViewControllerMine和ViewControllerPhotos,现在打算在ViewController Photo的照片墙上选择一张图片,并作为ViewControllerMine中一个头像按钮(buttonHeadImage)的背景图。
首先在ViewControllerPhotos中定义协议:
@protocol SelectPhotoDelegate <NSObject>
- (void) selectedPhoto: (UIImage*) headImage number: (NSInteger) numberOfPhotos;
@end
声明代理:
@property (nonatomic, assign) id<SelectPhotoDelegate> delegate;
在ViewController Mine中导入头文件并遵守协议,实现协议函数。
- (void)selectedPhoto:(UIImage *)headImage number:(NSInteger)numberOfPhotos {
if (headImage) {
[buttonHeadImage setBackgroundImage:headImage forState:UIControlStateNormal];
[headerHead setBackgroundImage:headImage forState:UIControlStateNormal];
}
self->numberLabel.text = [NSString stringWithFormat:@"%ld",numberOfPhotos];
self->numberLabel.textColor = [UIColor blackColor];
[scrollViewMain addSubview:numberLabel];
}
设置代理
- (void)changeHeadImage:(UIButton*) headImageButton{
ViewControllerPhotos* photoWall = [[ViewControllerPhotos alloc] init];
//设置代理
photoWall.delegate = self;
UINavigationController* photoWallNavigationController = [[UINavigationController alloc] initWithRootViewController:photoWall];
photoWallNavigationController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:photoWallNavigationController animated:YES completion:nil];
}
这里传过来一个UIImage* 的参数,非空,则直接把头像按钮的背景改变,另一个参数代表选中图片张数。
再看ViewcontrollerPhotos文件:
//点按“确定”按钮
- (void)pressRightButton {
//创建警报控制器
UIAlertController* confirmAlertController = [UIAlertController alertControllerWithTitle:@"选择头像" message:@"是否确认" preferredStyle:UIAlertControllerStyleAlert];
//确认选中
UIAlertAction* confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
if (self->imagesArray.count != 0) {
//图片数组非空
UIImage* headImage = self->imagesArray.firstObject;
//执行代理函数,传参
[self.delegate selectedPhoto:headImage number:self->imagesArray.count];
[[NSUserDefaults standardUserDefaults] setObject: headImage.accessibilityIdentifier forKey:@"headImage"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
[self.delegate selectedPhoto:nil number:0];
}
//选图视图dissmiss掉
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
}];
UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//点击了取消按钮,不进行响应
}];
[confirmAlertController addAction: cancel];
[confirmAlertController addAction: confirm];
[self presentViewController:confirmAlertController animated:YES completion:nil];
}
这样就把选图视图的图片参数与选图数量参数传到主视图中了。
以上是关于[iOS开发]多界面传值之代理传值的主要内容,如果未能解决你的问题,请参考以下文章