【问题标题】:Conditional Segue navigation from UITableViewCell based on response to UIAlertView基于对 UIAlertView 的响应从 UITableViewCell 进行条件 Segue 导航
【发布时间】:2012-01-22 11:22:32
【问题描述】:

我的问题似乎是一个通用问题,但似乎找不到答案。

我有一种情况,当用户点击自定义 UITableViewCell 时,我想显示一个警报,然后根据对警报的响应,要么留在同一个视图上(用户选择取消),要么显示另一个视图(如果用户选择继续)。我想使用故事板功能和转场来做到这一点。

如何解决这个问题?你必须用老式的方式来做这件事吗?

【问题讨论】:

    标签: uitableview ios5 uialertview storyboard


    【解决方案1】:

    @user,用旧的方式创建 alertView;我确实知道任何故事板功能可以以不同的方式执行此操作。故事板可以提供帮助的地方是 segues。您可以以编程方式调用 segue。使用警报视图取消按钮,您可以返回(即什么也不做)。对于另一个选项,要显示另一个视图,您可以以编程方式调用 segue 以转换到所需的视图。如果由于其他原因在情节提要上没有定义正确的转场,只需创建一个按钮并使用它来创建转场并命名。通过在情节提要中单击它来命名 segue,并使用属性检查器为其命名(标识符)。然后隐藏按钮或将其置于视图之外。我通常将这些类型的按钮放在工具栏上,并使用垫片将它们挡在视图之外。下面是一些示例代码:

    从警报视图委托中调用 segue,如下所示:

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

    也实现这个方法来做任何必要的任务来准备转场:

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

    【讨论】:

    • 这就是我所做的;只是看起来像一个黑客,我想有一个更明显的方式我忽略了。
    • @user,如果您或其他阅读本文的人发现了更好的方式,请告诉我们。
    【解决方案2】:

    您可以直接从startingViewController 到多个destinationViewControllers 创建segues,然后可以以编程方式“执行”。您不需要为它们创建任何隐藏按钮,这看起来确实像个 hack。

    【讨论】:

    • +1,但是如何直接从startingViewController 到多个destinationViewControllers 创建segue?你的意思是在视图控制器之间按住 Ctrl 并拖动,并命名 segues?
    • 是的,我的意思是你只是在视图控制器之间按住 Ctrl 并拖动。要点是您没有在情节提要视图中选择视图控制器的元素,而是选择实际的视图控制器本身并按住 Ctrl 键并从中拖动到其他视图。我自己做了这个,效果很好。
    • 不错!我不再需要幻像按钮了。
    • 如果你可以连接两个视图控制器,显然你会这样做。使用幻像按钮的原因是有时您想创建从视图控制器到自身的 segue,而 Xcode 似乎不允许您这样做。
    【解决方案3】:

    好的,我想出了一个与我喜欢的故事板保持一致的解决方案。

    例子:

    我的表格视图有 2 个部分,分组,单元格是动态原型。第 0 节包含一行/UITableViewCell & 我不希望它继续。第 1 部分包含多个单元格,我想触发转场并深入了解细节。

    在故事板中:

    • 我删除了将 tableviewcell 链接到目标视图控制器的 segue。
    • 我创建了一个“通用”segue,将源视图控制器直接链接到目标视图控制器。
    • 在 segue 的属性中,我设置了标识符 ('EditTimePeriod') 并将类型设置为 Push(我认为 Modal 的工作方式相同)。

    在源视图控制器中:

    • 在 prepareForSegue 方法中,我处理了从 UIBarButtonItem(添加)控制拖动的常见“AddTimePeriod”转场以及“通用”(vc-->vc)“EditTimePeriod”转场。

      - (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 中打开以进行标准 segue。无论如何,这是一个很好的练习:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2021-04-21
      • 2018-07-24
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多