iOS View 事件的傳遞 using Swift

一般來說 iOS 裡面最外層的就是 UIViewController這個元件 之後所以有的一個view不管是UILabelView,UIImageView,UITableView…..等 都是附加在這個容器上面

這裏就一個好玩的東西叫做Delegate, 他其實是一個protocol,就是要接收事情的物件實作這個protocol 就可以接收另外一個物件發送的事件

這個東西很好用就在於如果你將一個功能做一個一個物件,但是一這個物件接收到事件後, 必須傳遞到附加這個功能的主物件

這是時候就要用Delegate,在此說明一下使用方法:

例如說:

先宣告一個Delegate功能的protocol

protocol VideoListViewDelegate {
    func tableViewItemClick()
}

我有一個VideoListView的功能物件,當使用者按下TableView的row item時,我必須處理相關的事情 如此當事情發生時呼叫delegate?.tableViewItemClick()

import Foundation 
import UIKit

class VideoListView: UIView, UITableViewDelegate, UITableViewDataSource {

... 

var delegate: VideoListViewDelegate? 

... ...

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        delegate?.tableViewItemClick()


    }
}

之後在ViewController去實作這個protocol,然後再實作這個protocol的方法

import UIKit 

class VideoListHomePageViewController: UIViewController, VideoListViewDelegate { 

    override func viewDidLoad() { 
        super.viewDidLoad()
        var videoView = VideoListView()
        videoView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableViewItemClick()

      ....處理VideoListView的tableView Item按下時的事情


    }

}

如此就可以在兩個物件當中傳遞事件

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax