ios Delegate 实现 视图之间通信

MyDelete.h

objectivec 复制代码
#import <Foundation/Foundation.h>

@protocol MyDelegate <NSObject>
- (void)didUpdateText:(NSString *)text; // 委托方法
@end

ViewControler.h

objectivec 复制代码
//
//  ViewController.h
//  delegate
//
//  Created by xmkjsoft on 2024/8/12.
//

#import <UIKit/UIKit.h>
#import "MyDelegate.h"

@interface ViewController : UIViewController<MyDelegate>


@end

ViewControler.m

objectivec 复制代码
//
//  ViewController.m
//  delegate
//
//  Created by xmkjsoft on 2024/8/12.
//

#import "ViewController.h"
#import "OtherViewController.h"


@interface ViewController ()


@property (nonatomic, strong) UILabel *label;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
   
    [self loadUI];
      

    
    // 初始化 FirstViewController 并设置代理
    OtherViewController *firstVC = [[OtherViewController alloc] init];
    firstVC.delegate = self; // 设置代理
    
  
}

-(void) loadUI{
    // Set red background color
    self.view.backgroundColor = [UIColor redColor];
    
    // 创建标签以显示接收到的文本
       self.label = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 300, 50)];
       self.label.textAlignment = NSTextAlignmentCenter;
       [self.view addSubview:self.label];
    
    // 创建按钮以跳转到 OtherViewController
       UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
       [button setTitle:@"打开新视图" forState:UIControlStateNormal];
       button.frame = CGRectMake(100, 300, 200, 50); // 设置按钮的 frame
       [button addTarget:self action:@selector(showOtherViewController) forControlEvents:UIControlEventTouchUpInside];
       [self.view addSubview:button];
}


- (void)showOtherViewController {
    OtherViewController *otherVC = [[OtherViewController alloc] init];
    otherVC.delegate = self; // 设置代理
    [self presentViewController:otherVC animated:YES completion:nil];
}



// 实现代理方法
- (void)didUpdateText:(NSString *)text {
    self.label.text = text; // 更新标签文本
}



@end

OtherViewController.h

objectivec 复制代码
//
//  OtherViewController.h
//  delegate
//
//  Created by xmkjsoft on 2024/8/12.
//

#import <UIKit/UIKit.h>

#import "MyDelegate.h"

NS_ASSUME_NONNULL_BEGIN


@interface OtherViewController : UIViewController
@property (nonatomic, weak) id<MyDelegate> delegate; // 代理属性

@end

NS_ASSUME_NONNULL_END

OtherViewController.m

objectivec 复制代码
//
//  OtherViewController.m
//  delegate
//
//  Created by xmkjsoft on 2024/8/12.
//

#import "OtherViewController.h"
#import "ViewController.h"

@interface OtherViewController ()

@property (nonatomic, strong) UIPanGestureRecognizer *panGestureRecognizer;

@end

@implementation OtherViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 添加手势识别器
       self.panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
       [self.view addGestureRecognizer:self.panGestureRecognizer];

    
    [self loadUI];

    
    
}


- (void)handlePan:(UIPanGestureRecognizer *)gesture {
    CGPoint translation = [gesture translationInView:self.view];
    
    if (gesture.state == UIGestureRecognizerStateChanged) {
        // 检测滑动方向
        if (translation.y < -30) {
            NSLog(@"向上滑动");
            // 在这里处理向上滑动的逻辑
        } else if (translation.y > 30) {
            NSLog(@"向下滑动");
            // 在这里处理向下滑动的逻辑
            if ([self.delegate respondsToSelector:@selector(didUpdateText:)]) {
                               [self.delegate didUpdateText:@"上个视图通过下滑让我变hello,hello"];
                           }
            
            [self closeModal];
        }
    }
}


- (void)closeModal {
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"模态视图已关闭");
    }];
}


- (void) loadUI{
    self.view.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
    UIButton *getOtherViewControllerButton = [UIButton buttonWithType:UIButtonTypeSystem];
    [getOtherViewControllerButton setTitle:@"点我更新上一个视图内容" forState:UIControlStateNormal];
    [getOtherViewControllerButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [getOtherViewControllerButton setBackgroundColor:[UIColor blueColor]];
    [getOtherViewControllerButton.layer setCornerRadius:5.0];
    getOtherViewControllerButton.frame = CGRectMake(100, 100, 200, 50);
    [getOtherViewControllerButton addTarget:self action:@selector(getOtherViewControllerMethod) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:getOtherViewControllerButton];
    
    
    // 创建标签并设置文本
        UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 160, 350, 50)]; // 设置标签位置
        textLabel.textAlignment = NSTextAlignmentCenter; // 文本居中
        textLabel.textColor = [UIColor whiteColor]; // 设置文本颜色
        textLabel.text = @"下滑用代理更新上一个视图的文本为hello"; // 默认文本
        // 将标签添加到视图中
        [self.view addSubview:textLabel];
}



- (void)getOtherViewControllerMethod {


    if ([self.delegate respondsToSelector:@selector(didUpdateText:)]) {
                       [self.delegate didUpdateText:@"我是通过代理从别的视图里触发显示的"];
                   }
    
}


@end
相关推荐
与火星的孩子对话9 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
九丝城主19 小时前
2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--上篇
服务器·flutter·macos·vmware
芳草萋萋鹦鹉洲哦1 天前
【vue3+tauri+rust】如何实现下载文件mac+windows
windows·macos·rust
恋猫de小郭1 天前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
点金石游戏出海2 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生2 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔2 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244802 天前
谈一谈iOS线程管理
ios·objective-c
Digitally2 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智2 天前
IOS 蓝牙连接
macos·ios·cocoa