2011-12-17 29 views
6

我的問題看起來像一個普遍的問題,但似乎無法找到答案。從UITableViewCell的條件Segue導航基於對UIAlertView的響應

我有一種情況,當用戶點擊一個自定義的UITableViewCell時,我想顯示一個警報,然後根據對警報的響應,保持在相同的視圖(用戶選擇取消)或顯示另一個視圖(如果用戶選擇繼續)。我想用故事板功能& segues來做到這一點。

怎麼會這樣呢?你必須以舊式的方式來做這件事嗎?

回答

11

@user,只需創建alertView舊的時尚方式;我知道任何故事板功能以不同的方式做到這一點。故事板可以幫助的地方在於賽段。您可以通過編程方式調用segues。隨着你警告視圖取消按鈕,你可以返回(即什麼都不做)。對於另一個選項,要顯示另一個視圖,可以通過編程方式調用一個segue來轉換到所需的視圖。如果在故事板上沒有爲某些其他原因定義適當的segue,只需創建一個按鈕並使用該按鈕創建segue並將其命名即可。通過在故事板中單擊來命名segue,並使用屬性檢查器給它命名(標識符)。然後隱藏按鈕或將其放在視圖外。我通常會將這些類型的按鈕放在工具欄上,並使用間隔符將它們放在視圖外面。下面是一些示例代碼:

呼叫從警報視圖委託SEGUE這樣的:

[self performSegueWithIdentifier: @"done" sender: self]; 

也實現了這個方法做任何必要的任務,爲SEGUE準備:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     // [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
     // [[segue destinationViewController] setSelectedClient:selectedClient]; 
    } 
} 
+1

這就是我所做的;只是看起來像這樣一個黑客,我覺得有一個更明顯的方式,我忽略了。 – 2011-12-17 19:31:31

+1

@user,如果您或其他讀者發現了更好的方式,請通知我們。 – 2011-12-17 20:54:22

8

你可以直接從startsViewController創建segues到多個destinationViewController,然後可以通過編程方式「執行」。你不需要爲它們創建任何隱藏的按鈕,這看起來像一個黑客。

4

好的,我想出了一個解決方案,以符合我喜歡的故事板。

實施例:

我的tableview有2個部分,分組,和細胞是動態的原型。部分0包含一行/ UITableViewCell &我不希望它繼續。第1部分包含多個單元格,我希望觸發細節&深入細節。

在故事板:

  • 我除去SEGUE鏈接tableviewcell到目的地視圖控制器。
  • 我做了一個'通用'segue將源視圖控制器直接鏈接到目標視圖控制器。
  • 在segue的屬性中,我設置了標識符('EditTimePeriod')並將其類型設置爲Push(我認爲Modal的工作原理相同)。

在源視圖控制器:從我的UIBarButtonItem(添加)

  • 在prepareForSegue方法我處理兩者共用「AddTimePeriod」 SEGUE我控制-拖動,沿着「通用」( vc - > vc)'EditTimePeriod'segue。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        // handle the click of the 'Add' bar button item  
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         // database & entity stuff for adding the new one to the mOC, etc 
        } 
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
         tpvc.timePeriod = newTP; 
        } 
    } 
    
  • 然後我實現了的tableView:didSelectRowAtIndexPath方法方法,並把我的條件在這裏。如果選擇的行是部分零以外我手動稱爲EditTimePeriod SEGUE,限定發送者作爲選定tableviewcell:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        if(self.tableView.indexPathForSelectedRow.section!=0){ 
         [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]]; 
        } 
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    
        return;  
    } 
    

將是很好的第0單元代碼,使得其不可選首先! 但希望這有助於。

**然後5分鐘後,我又看了一眼,意識到我可以將0節的數據移動到節頭中,這更直觀,而且還沒有被使用。不需要任何條件/檢查就可以將設計從每個tableviewcell的標準賽格開放。雖然是一個很好的鍛鍊:)