2011-12-17 25 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的标准赛格开放。虽然是一个很好的锻炼:)