[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开发]多界面传值之代理传值的主要内容,如果未能解决你的问题,请参考以下文章

ios 为啥model传值之后视图会消失

iOS 代理反向传值

iOS开发之界面间传值

iOS开发之界面间传值

IOS页面(控制器之间)传值之Block

iOS--页面间的代理传值(属性代理(委托)代码块单例通知)