fb_license

技術標籤

@selector (1) 初使化區塊 (1) 物件 (1) 物件導向 (2) 型別 (4) 封裝 (1) 流程控制 (1) 陣列 (3) 推論型別 (2) 實機測試 (1) 蓋索林(gasolin) (1) 模組 (1) 憑證 (1) 轉型 (1) 羅康鴻 (121) 類別 (1) 變數 (5) Accelerometer (1) ActiveRecord (1) Activity (1) AFNetworking (1) alloc (1) Android (3) Animation (1) App (1) App ID (1) APP上傳 (1) ASP.NET (1) AVAudioPlayer (1) block (1) C# (2) class (1) CLLocationManager (1) CLLocationManagerDelegate (1) CMMotionManager (4) Controller (1) delegate (1) DELETE語法 (1) Device Motion資料 (1) Dialog (1) DropDownList (1) dynamic language (2) Facebook SDK (9) FBRequest (5) FBRequestConnection (2) FMDB (1) Gesture Recognizers (6) GROUP BY (2) Gyro (1) HAVING (1) IBAction (1) IBOutlet (1) id (3) inheritance (1) init (1) Insert (1) instance variable (1) Interface Builder (1) iOS (70) iOS idea (7) iOS Introduction (1) Layout (1) Magnetometer (1) Menu (2) Method (2) MKMapView (1) MKPointAnnotation (1) MS SQL (5) Nil (1) NSArray (1) NSDictionary (1) NSError (1) NSFileManager & .plist (1) NSMutableArray (1) NSMutableDictionary (1) NSNotificationCenter (1) NULL (1) object (2) Objective-C (16) Objective-C idea (1) ORDER BY (1) Parameter (1) property (1) protocol (2) Provisioning (1) Proximate Sensor (1) Q and A (2) R類別 (1) Rails (9) RESTful SOA (9) Ruby (8) Scene (1) SEELECT (1) Segue (2) SEL (1) SELECT語法 (1) Shake (1) Simulator (1) SOA (8) SQL (6) SQL Server (5) SQL函數 (1) SQL彙總函數 SQL (1) SQLite (1) Storyboard (1) Style (1) Swift (1) Table (1) target & action (1) Theme (1) Toast (1) TRUNCATE TABLE語法 (1) UIActionSheet (1) UIActionSheetDelegate (1) UIActivityIndicatorView (1) UIAlertView (1) UIBarButtonItem (1) UIButton (1) UICollectionView (1) UICollectionViewDataSource (1) UIControl (9) UIDatePicker (1) UIImage (1) UIImagePickerController (2) UIImagePickerControllerDelegate (2) UIImageView (1) UILabel (1) UILongPressGestureRecognizer (1) UINavigationController (2) UIPanGestureRecognizer (1) UIPinchGestureRecognizer (1) UIProgressView (1) UIResponder (1) UIRotationGestureRecognizer (1) UISegmentedControl (1) UISlider (1) UIStepper (1) UISwipeGestureRecognizer (1) UISwitch (1) UITabBarController (1) UITableView (1) UITableViewDataSource (1) UITapGestureRecognizer (1) UITextField (1) UITextFieldDelegate (1) UITextView (2) UITextViewDelegate (1) UIToolBar (1) UIView (8) UIWebView (1) UPDATE語法 (1) var (2) VB.NET (7) View (4) WHERE子句 (1) XML (1)

2013/06/07

[iOS] 委托別人作事 - delegate & protocol


idea...





我是iOS中的任何東西
我想把一些工作外包出去

我是外包者,我想外包你的工程,
但我不知道你的工作內容是不是符合我?


我是protocol協定,我定義了4個洞的工作,任何東西說只要符合我這個protocol協定,就可以幫anything作事


哦Yes,我是外包者,我剛好有4個腳,
會作這個4個洞的工作。




任何東西說:「即然你符合protocol協定的4個洞的工作要求,那就讓我們合作愉快吧,我把事情委派給你」。



以UITableView為例,接下來的範例,UITableView將會把"產生資料"的工作進行委派,將工作交辦給另一個物件。



第1步:建立一個名為"Delegate_Protocol"的"Single View Application"專案。


第2步:加入"UITableView"至畫面中。




第3步:建立UIViewTable的IBOutlet,並取名為"tableView"。




第4步:為"ViewController"加上"UITableViewDataSource" protocol協定,以擁有載入資料至UITableView的能力。

  • 4.1 為"ViewController"加上"UITableViewDataSource" protocol協定,於UIViewController後方加上"<UITableViewDataSource>"

        @interface ViewController : UIViewController <UITableViewDataSource> 

        @end 


     - (NSInteger)tableView:(UITableView *)tableView 
       numberOfRowsInSection:(NSInteger)section
     {
          //回傳3,表示有3筆資料   
          return 3;
     }

  • 4.3 於"ViewController.m"檔中實作 "– tableView:cellForRowAtIndexPath:"方法,以依照列數回傳UITableViewCell物件,而UITableViewCell物件即是UITableView用來顯示一筆資料的物件。在此建立UITableViewCell物件,透過indexPath的row屬性取得列數,並轉成字串設定給UITableViewCell,最後回傳cell物件,以供UITabelView顯示於畫面上(在此為了更容易了解程式,以直接建立UITableView的方式取得cell物件,正確的寫法應是可將同性質的UITableViewCell拿來重複使用才對)。

      - (UITableViewCell *)tableView:(UITableView *)tableView 
               cellForRowAtIndexPath:(NSIndexPath *)indexPath
      {

          //建立UITableViewCell物件
          UITableViewCell *cell = [[UITableViewCell alloc] init]

          //依indexPath的row屬性取得目前所在的列數, 
          //並透過NSString的initWithFormat將int轉換為字串。
          NSString *rowNumber = [[NSString alloc] initWithFormat:@"%i", [indexPath row] ]; 

          //UITableViewCell有個屬性為textLabel, 
          //其是⼀一個UILabel物件, 
          //透過setText可設定其顯示的字樣 
          [cell.textLabel setText:rowNumber]; 

          //回傳cell物件,以供UITableView顯示在畫面上 
          return cell;
       } 



第5步:將實作"UITableViewDataSource"的ViewController(self),指派至UIViewTable的dataSource屬性中,好將UITableView取得資料的工作委派給ViewController(self)物件。當然,UITableView則會以"UITableViewDataSource"protocol協定向ViewController物件要資料。


- (void)viewDidLoad {
    [super viewDidLoad];
    //將實作UIViewTableDataSource的ViewController(self), 
    //指派給UITable的dataSource屬性中, 
    //好將UITableView取得資料的工作, 
    //委派給ViewController(self)物件。 
    self.tableView.dataSource = self;


第6步:執行,這時畫面上會出現3筆資料,而資料則是以委派的方法,委派給實作"UITableViewDataSource"protocol協定的ViewController物件所提供的。





檔案連結:Delegate_Protocol.zip