排除公告

嗨!遊客

歡迎您的到來喔!第一次來此嗎?

如有任何問題,還請到 建言/問題

分享 Swift delegate(委派) for application

本帖由 tkdmaf2016-11-07 發佈。版面名稱:iOS / Swift

  1. tkdmaf

    tkdmaf 版主
    管理成員

    註冊:
    2016-10-02
    文章:
    2
    讚:
    1
    幾乎所有的iOS的書都會講解關於delegate的用法。

    但是大都只講到class和class之間的功能委派方式。

    但今天可能會有一個需求是說,如果你設計了一個總頁框,要怎麼讓每一個子頁框都可以相互呼叫對方的delegate method。
    (為何要這麼做?也許你在某個頁面更新了資料而希望另一個暫存在記憶體中的頁面的資料能即時更動。)

    其實要做到這件事,很簡單的就是直接使用AppDelegate.swift
    不過,不是很建議把delegate全交給AppDelegate。
    你可以做一件事,就是設置一個VCDelegate.swift (不是VCD喔!是ViewControllerDelegate的縮寫)
    設置好你的class,然後在AppDelegate.swift添加這樣的code
    代碼:
    let vcDelegate = VCDelegate()
    
    之後,將你所有要設計的protocol和委派的內容指向這個vcDelegate如下:

    代碼:
    import UIKit
    
    protocol MYDelegate1 {
        
        func method1()
    
    }
    
    protocol MYDelegate2 {
    
        func method2()
    
    }
    
    class VCDelegate:NSObject {
    
        let myDelegate1:MYDelegate1?
        let myDelegate2:MYDelegate2?
    
    }
    
    當你在建立ViewController時,就可以預設置好你的委派對象
    代碼:
    class MyViewController1:UIViewController,MyDelegate1 {
     
        let vcDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate).vcDelegate
    
        override func viewDidLoad(){
            super.viewDidLoad()
            vcDelegate.myDelegate1 = self  //將自己的代理設置給vcDelegate.myDelegate1
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        func method1(){
            //to do your method
        }
    }
    
    而如果你在另一個class要呼叫MyViewController1的方法時就如此做:

    代碼:
    class MyViewController2:UIViewController {
    
        let vcDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate).vcDelegate
    
        override func viewDidLoad(){
            super.viewDidLoad()
            vcDelegate.myDelegate1?.method1() //這樣一來就會執行MyViewController1的mtehod1
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    }
    
    
    要注意一件事就是,假設第一個class「忘記宣告自己」進入delegate的話。
    並不會發生錯誤。頂多就只是委派對象不存在而已。(因為用了?而允許了nil的存在,而判定為nil時,後就的方
    法自然就不會執行)

    另外,這種方法雖好也方便,可是你要注意記憶體使用上的關係。
    假設你因為任何的理由而致使這個class被dismiss……
    建議最好在dismiss前先將delegate指向自己改為nil。
     
    • 喜歡 喜歡 x 1

分享此頁面

正在載入...