首先推薦大家看這本書,整本書邏輯非常清晰,代碼如何從無到有,到豐滿說的很有條理.
說實話本書到目前為止錯誤還是極少的,不過人無完人,在第14章前半部分項目的代碼中,作者在MasterVC到DetailVC中又直接添加了一個segue,該segue的ID為”masterToDetail”,作用是當新建一個tinyPix文檔時可以直接跳轉到DetailVC來編輯文檔.
作者同樣意識到如果直接從MasterVC的表視圖cell直接轉到DetailVC時也需要做一些額外的操作,該操作的作用是,當用戶點擊已存在的tinyPix時跳轉到DetailVC中打開已存在的文檔.
作者是這樣修改prepareForSegue::方法的:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if (sender == self) {
UIViewController *destination = segue.destinationViewController;
if ([destination respondsToSelector:@selector(setDetailItem:)]) {
[destination setValue:_chosenDoc forKey:@"detailItem"];
}
}else{
NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;
NSString *filename = _docFilenames[indexPath.row];
NSURL *docUrl = [self urlForFilename:filename];
_chosenDoc = [[HyTinyPixDocument alloc]initWithFileURL:docUrl];
[_chosenDoc openWithCompletionHandler:^(BOOL success){
if (success) {
UIViewController *destination = segue.destinationViewController;
if ([destination respondsToSelector:@selector(setDetailItem:)]) {
[destination setValue:_chosenDoc forKey:@"detailItem"];
}
}else{
NSLog(@"failed to load!");
}
}];
}
}
但是實際執行App時發現點擊已存在的tinyPix文件並不能正確在DetailVC中顯示文檔的內容.在上述方法的else分支後下斷點,發現由TableViewCell跳轉而來的代碼其segue.destinationViewController並不是我們希望的DetailViewController,而是UINavigationController.而後者自然不存在神馬setDetailItem:方法.
我不知道這是作者的筆誤還是什麼其他原因,或者是新版的Xcode中Master-Detail Application模板發生了變化?但至少在Xcode7.2中情況是這樣.
那麼如何修復這個問題呢?其實比你想象的要簡單,修改如下:
if (success) {
//UIViewController *destination = segue.destinationViewController;
DetailViewController *detailVC = (DetailViewController*)[
segue.destinationViewController topViewController];
if ([detailVC respondsToSelector:@selector(setDetailItem:)]) {
[detailVC setValue:_chosenDoc forKey:@"detailItem"];
}
}else{
NSLog(@"failed to load!");
}
在這裡我們需要的是destinationVC的topViewController對象,而不是destinationVC本身.
編譯連接App,現在兩種方法進入到DetailVC都表現正常了: