source code在此:範例檔案下載AppPrototype
難得周日在家,就把昨天老師說的練習做完
老實說其實我弄很久(大概有八~九小時跑不掉= =)
可見真的很不熟悉,debug之類都超級慢的
首先就是在跳去圖表的地方,
原本在實作實際功能前可以正常出現圖表,後來不知為何會當掉,
光這個無聊的bug就找了兩三小時(遮臉)
後來發現是因為下面這段程式碼
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ InputViewController * inputCon = segue.destinationViewController; inputCon.delegate = self; }
因為只要是storyboard控制的頁面切換,都會呼叫prepareForSegue
我同時用storyboard去切換新增資料和圖表頁面,
所以圖表的segue.destinationViewController不是InputViewController就會跳錯誤。
在這邊也要說,老師說的inputCon.delegate等於setDelegate是很重要的
因為錯誤訊息一直說沒有setDelegate這個方法
結果我還一直傻傻看不懂是什麼意思~>”<~
(老師上課有說!妳有沒有在聽阿!)
然後第二個遇到的困難,就是我要在轉圖表畫面時,需要把現有資料傳至圖表畫面
一開始我還傻傻的在那又把CostViewController弄一個@protocol
想說要實作一個delegate機制,又是一方面要實作別人的delegate,又要是別人的protocol,
搞得我好混亂阿~
後來才發現delegate似乎是被呼叫者,要把資料傳給呼叫者時才需使用(不確定,有錯請指正)
後來為了要傳遞資料,我不去使用storyboard的切換頁面方式,改使用程式去自行切換頁面
以下為傳送列表資料的程式碼
- (IBAction)showPieChart:(id)sender { PieChartViewController * pieController = [[PieChartViewController alloc] init]; [self.navigationController pushViewController:pieController animated:YES]; [pieController showPieChart:self record:self.record]; }
最後要做的是實作修改和刪除資料的功能
第一步是先將CostViewController實作UITableViewDelegate
@interface CostViewController : UITableViewController<inputViewControllerDelegate,UITableViewDelegate>
本來我還很害怕實作完還要設什麼delegate,或還要自己去呼叫該方法,
結果太令人開心了,只要實作了tableView,按table cell時他就會自己呼叫(灑花)
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //修改該筆資料 InputViewController *inputCon = [self.storyboard instantiateViewControllerWithIdentifier:@"inputCon"]; [self.navigationController pushViewController:inputCon animated:YES]; [inputCon modifyData:self.record[indexPath.row] forKey:indexPath.row]; inputCon.delegate = self; }
不過這樣子我還是遇到了一個問題,就是叫出來的畫面是一片黑。
百思不得其解也找不出原因,
後來嘗試的把原本在storyboard裡InputViewController和CostViewController的連接關係拿掉,
突然畫面就又跑出來了。
初步推論是或許一個畫面若用storyboard來切換就會無法自己寫程式碼去切換,
所以當有一個畫面有兩個按鈕都可以連接到時,就需要都自己用程式碼去做掉切換的動作。
剩的就把功能實作完就大功告成囉!
畫面介紹:一進入APP時的畫面
新增/修改記帳資料的畫面
帳目總計圖表
source code在此:範例檔案下載AppPrototype