2010年7月8日 星期四

UITableViewController 之 didSelectRowAtIndexPath 無反應的問題

想說寫個簡單的 UITableViewController 來了解一些流程細節,結果每當我按下某個項目時,卻遲遲沒有動作?確認後,發現 didSelectRowAtIndexPath 函式完全沒進入。找了一些文章,也看不出個所以然,畢竟完完全全是最簡單的 UITableViewController ,新增後只修改 numberOfSectionsInTableView 和 numberOfRowsInSection 回傳的數字而已。


經過幾番確認,最後發現是我自己呼叫的流程問題:


錯誤的程式碼:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    UINavigationController *n = [[UINavigationController alloc] init];
    
    MyUITableViewController *t = [[MyUITableViewController alloc] initWithStyle:UITableViewStylePlain];
    [n pushViewController:t animated:YES];
    t.title = @"MyTable";

    [window addSubview:n.view];
    [t release];
    [n release];
    // Override point for customization after application launch.
    
    [window makeKeyAndVisible];
    
    return YES;
}


錯誤的地方就只是把 UINavigationController 給 release 掉,然後他又會 release 掉 MyUITableViewController,因此關於 MyUITableViewController 物件就等於被回收掉。需留意 [window addSubview:n.view] 也只是會對那個 view 做 retain 而已,所以整個 table 還是看的到,但 controller 的事件卻無反應。


在此僅小小測試用的解法,就是不要去做 [n release] 。若是真正要跑的程式,應該是擺在 dealloc 函式中去處理,而 UINavigationController 要拉到 Interface 裡頭宣告。果真一個禮拜沒寫 iPhone 就會快忘光了!這個簡單的東西花了十來分鐘才發現。


而回到原本的測試是單純想要了解,從一個 UITableViewController 初始化、被切換到另一個 View 時,再被切回來時會呼叫哪些函數。測試的程式就只是在 MyUITableViewController 的 didSelectRowAtIndexPath 裡頭,宣告一個新的 MyUITableViewController 並 push 到 self.navigationController 裡頭,接著再 back 回來。從一開始的執行到結束所印出的訊息:


tabletest[1706:207] viewDidLoad:First
tabletest[1706:207] viewWillAppear:First
tabletest[1706:207] viewDidAppearFirst
tabletest[1706:207] >>>>In didSelectRowAtIndexPath<<<<
tabletest[1706:207] viewDidLoad:Second
tabletest[1706:207] viewWillDisappear:First
tabletest[1706:207] viewWillAppear:Second
tabletest[1706:207] viewDidDisappear:First
tabletest[1706:207] viewDidAppearSecond
tabletest[1706:207] viewWillDisappear:Second
tabletest[1706:207] viewWillAppear:First
tabletest[1706:207] viewDidDisappear:Second
tabletest[1706:207] viewDidAppearFirst


沒有留言:

張貼留言