2013-01-24 20 views
1

我在更新U.I時遇到了一個奇怪的問題。在賽後。這是一個非常標準的設計:用戶在tableview中選擇一個單元格,這會觸發一個細節屏幕的細節,該細節屏幕反映了所選單元格中對象的值(在本例中爲蘆葦),並允許用戶編輯。傳遞核心數據對象 - segue不會更新U.I.第一次嘗試

我在具有兩個組件,一個索引號和一個品牌的詳細屏幕中有一個選擇器視圖。

當我點擊一個單元格時,segue去,但U.I.不更新 - 選擇器保持默認狀態,索引爲0.

如果我點擊「取消」返回到表格視圖,然後再次單擊相同的單元格,詳細視圖將會正確更新。

如果我然後點擊取消並選擇一個新的單元格,詳細視圖仍然反映最後單元格單擊。如果我再次點擊它,它會正確更新。你得到的圖片:我必須點擊任何給定的單元格兩次才能更新。

編輯:我意識到我在故事板和手動通過代碼調用兩次segue。我刪除了手動調用performSegue的代碼行......現在對象只被傳遞一次,但它仍然不會在第一次嘗試時更新。

選擇器在ViewDidLoad中被分配(沒有值),如果這有所作爲。然後它應該在ViewDidAppear中更新。

我的fetchedResultsController的緩存名稱初始化爲「nil」。這意味着沒有緩存,對吧?所以這不是問題?

以下是表格視圖中的相關代碼。 reedToEdit是這個類,它被傳遞到細節控制器(具有相同名稱的屬性)的屬性:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
self.reedToEdit = [fetchedResultsController objectAtIndexPath:indexPath]; 

} 




-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
UINavigationController *navigationController = segue.destinationViewController; 
ReedDetailsViewController *controller = (ReedDetailsViewController *) [[navigationController viewControllers] objectAtIndex:0]; 

if ([segue.identifier isEqualToString:@"AddReed"]) { 
    controller.reedToEdit = nil; 
    controller.managedObjectContext = self.managedObjectContext; 
    controller.delegate = self; 
} else if ([segue.identifier isEqualToString:@"ShowReed"]) { 
    controller.reedToEdit = self.reedToEdit; 
    NSLog(@"*** prepareForSegue. reedToEdit = %@", controller.reedToEdit); 
    NSLog(@"controller = %@", controller); 

    controller.title = @"Edit Reed"; 
    controller.managedObjectContext = self.managedObjectContext; 
    controller.delegate = self; 
} else { 
    NSLog(@"***Unrecognized segue"); 
    abort(); 
    } 
} 

下面是從細節控制器代碼(與選擇器視圖)。

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (self.reedToEdit != nil) { 
     isEditing = YES; 
     [self updateInterface]; 
    } 
} 

-(void)updateInterface 
{ 
    [picker selectRow:[self.reedToEdit.indexNumber intValue] -1 
     inComponent:1 
     animated:NO]; 

    [picker selectRow:[self rowForBrand: self.reedToEdit.brand] 
     inComponent:0 
     animated:NO]; 

} 
+0

您是否嘗試在'-updateInterface'中設置斷點或記錄消息以查看視圖控制器第一次出現時是否調用了該消息?另外,'-viewDidAppear:'中的'reedToEdit'的值? – paulmelnikow

+0

好的建議,因爲他們證實了我的信仰:第一次點擊任何單元格時,對象不會被傳遞。 第一次單擊單元格時,'reedToEdit'爲空。由於'if'語句,'-updateInterface'不被調用。 當你再次點擊同一個單元格時,'reedToEdit'被正確地傳遞並調用'-updateInterface'。 任何關於我應該從哪裏出發的建議?謝謝! –

+0

您是否在'prepareForSegue'中檢查了'self.reedToEdit'的值?如果它是零,那麼蒙迪的答案應該可以解決你的問題。 (無論哪種方式,這是一個很好的改變。) – paulmelnikow

回答

4

我看到幾個問題。

首先,一個參數傳遞給總部設在選擇指數的路徑你賽格瑞的正確方法是didSelectRowAtIndexPath:設置伊娃和prepareForSegue:使用此伊娃。相反,您應該使用sender對象。

UITableViewCell *cell = (UITableViewCell*) sender; 
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
Reed *reedToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

順便說一句,你可以把它們if條款區分塞格斯避免線路的冗餘像

controller.managedObjectContext = self.managedObjectContext; 
controller.delegate = self; 

其次,什麼是主要的化妝品問題是,你設置的選擇器的屬性沒有動畫viewDidAppear:作爲一個經驗法則,如果控制器不在屏幕上,則不應該使用動畫,否則動畫是爲了。設置您的UI元素的值的適當位置在viewWillAppear:或甚至在viewDidLoad:,即之前,它們出現在之前。

+0

Mundi,非常感謝你!立即修復它。我非常欣賞詳細的解釋。我希望我可以upVote,但我太新了...希望其他人會。 –