故事板两个场景。将场景2中UITableViewCell的文本转换为场景1中的UILabel

时间:2012-12-31 16:09:31

标签: ios uitableview storyboard scene

故事板中有两个场景。由于我不允许上传图片(新用户),我们称之为场景1和场景2。

场景1:带UILabel的UITableViewCell,当选择此单元格时,它会转到场景2.
场景2:为用户提供在UITableView中选择的选项。选择一个选项后,它会在所选UITableViewCell旁边放置一个复选标记。

如何在场景2中单击“保存”按钮时获取它,它将从场景2中选择的UITableViewCell中获取文本,并将用户带回场景1并使用场景2中的文本填充UILabel?

我使用storyboard来创建UITableViews。每个单元格都有自己的类。谢谢。

1 个答案:

答案 0 :(得分:1)

使用委托设计模式允许两个对象相互通信(Apple reference)。

一般来说:

  1. 在场景2中创建一个名为delegate的属性。
  2. 在场景2中创建一个协议,用于定义场景2委托必须定义的方法。
  3. 在场景1到2的segue之前,将场景1设置为场景2的委托。
  4. 在场景2中选择一个单元格时,向场景2的委托发送一条消息,通知代表选择。
  5. 允许代表处理选择并在选择后关闭场景2.
  6. 作为一个例子:

    场景2界面

    @class LabelSelectionTableViewController
    
    @protocol LabelSelectionTableViewControllerDelegate
      - (void)labelSelectionTableViewController:(LabelSelectionTableViewController *)labelSelectionTableViewController didSelectOption:(NSString *)option;
    @end
    
    @interface LabelSelectionTableViewController : UITableViewController
      @property (nonatomic, strong) id <LabelSelectionTableViewControllerDelegate> delegate;
    @end
    

    场景2实施

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
      UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];   
      [self.delegate labelSelectionTableViewController:self didSelectOption:cell.textLabel.text];
    }
    

    场景1实现

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
      if ([segue.destinationViewController isKindOfClass:[LabelSelectionTableViewController class]] == YES)
      {
        ((LabelSelectionTableViewController *)segue.destinationViewController).delegate = self;
      }
    }
    
    // a selection was made in scene 2
    - (void)labelSelectionTableViewController:(LabelSelectionTableViewController *)labelSelectionTableViewController didSelectOption:(NSString *)option
    {
      // update the model based on the option selected, if any    
      [self dismissViewControllerAnimated:YES completion:nil];
    }