• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

swift--四种传值(代理、闭包、属性、通知)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 创建swift文件不做任何继承
class TheOneAndOnlyKraken {
    // 存储属性
    var name : String?
    var age : Int = 0
    
    static let sharedInstance = TheOneAndOnlyKraken()
    // 防止外部调用
    private init() {} //This prevents others from using the default '()' initializer for this class.
}
  • 外部访问
TheOneAndOnlyKraken.sharedInstance

代理传值

  • B需要代理,声明以及声明方法func eatMany(food1: String) -> Void
protocol EatFoodDelegate {
    func eatMany(food1: String) -> Void
}
  • A遵循代理并实现方法

// 第一种设置代理方式
extension ViewController : EatFoodDelegate{
    func eatMany(food1 : String) -> Void {
        print(food1)
    }
}

// 第二种设置代理方式, 逗号 + 代理协议
// class ViewController: UIViewController, EatFoodDelegate 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("触摸屏幕")
        
        let vcOne = TestOne()
        // 设置代理
        vcOne.delegate = self
        vcOne.strBlock = {(str1 : String, str2 : String) -> Void in
            print(str1 + str2)
        }
        self.present(vcOne, animated: true) {
            print("跳转完成")
        }
        
    }

闭包传值

  • 回调到控制器A
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("触摸屏幕")
        
        let vcOne = TestOne()
        // 实现闭包 处理回调
        vcOne.strBlock = {(str1 : String, str2 : String) -> Void in
            print(str1 + str2)
        }
        self.present(vcOne, animated: true) {
            print("跳转完成")
        }
        
    }

  • 控制器B
  • 声明闭包类型
  • 两个字符串参数, 返回空类型 ? 延迟初始化
var strBlock : ((_ str1 : String, _ str2 : String) -> Void)?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//        self.dismiss(animated: true) {
//            print("控制器消失了")
//        }
    // 对于当前没有进行初始化的对象选择了optional 即 ? 延迟初始化,需要解包时
    // ! 感叹号解包如果对象为空nil Unexpectedly found nil while unwrapping an Optional value
    // ? 问号解包 对象为空不崩溃 -建议用?
        strBlock?("hello", "world")
        let dic = ["name" : "张三", "age" : 18] as [String : Any]
        NotificationCenter.default.post(name : NSNotification.Name.init(rawValue: "h"), object: dic)
    }

发送通知

  • 注册通知 & 接收通知
  • 方法必须是oc方法 @objc前缀修饰
  • 通知名字NSNotification.Name(rawValue: "h")
// 添加通知实现同时方法
override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.hello), name: NSNotification.Name(rawValue: "h"), object: nil)
    }
    
    @objc func hello() -> Void{
        print("hello")
    }

  • 发送通知
  • 通知名字NSNotification.Name.init(rawValue: "h")
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.dismiss(animated: true) {
            print("控制器消失了")
        }
        
        NotificationCenter.default.post(name : NSNotification.Name.init(rawValue: "h"), object: nil)
    }

  • 移除通知

deinit {
        NotificationCenter.default.removeObserver(self)
    }


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3)发布时间:2022-07-18
下一篇:
Swift语言发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap