2012-12-31 71 views
0

我在故事板中有两个场景。因为我不能上传图片(新用户),我们姑且称之为场景1和场景2故事板两个场景。从场景2中的UITableViewCell到场景1中的UILabel的文本

场景1:使用的UITableViewCell一个UILabel,当选择该单元格,它把你带到场景2
场景2:为用户提供在UITableView中进行选择的选项。一旦选择了选项,它会在选中的UITableViewCell旁边放置一个复选标记。

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

我用故事板来创建UITableViews。每个单元都有它自己的类。谢谢。

回答

1

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

一般:

  1. 创建场景2名为委托的属性。
  2. 在场景2中创建一个协议,该协议定义场景2委托人必须定义的方法。
  3. 在从场景1到场景2继续前,将场景1设置为场景2的代表。
  4. 当在场景2中选择一个单元格时,向场景2的代表发送消息以通知代表该选择。
  5. 允许代表在选择后处理选择和解除场景2。

并且作为示例:

场景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]; 
} 
+0

谢谢你的迅速回复。所以我遵循你的代码。误区三: 场景1 = STLetsMeet 场景2 = STStartTransport 错误1是STStartTransport.h: @ protocol STStartTransportDelegate - (void)stStartTransport:(STStartTransport *)stStartTransport didSelectOption:(NSString *)option; // I get an error on this line: !Expected a type @end //Rest of the code in that file is fine as below: @ interface STStartTransport : UITableViewController @ property (nonatomic, strong) id delegate; @ end user1107173

+0

没问题。这是一个编译器错误b/c编译器不知道有关STStartTransport类型(即接口声明在协议声明之后)。在协议声明之前添加@class STStartTransport,如上面编辑的版本所示。希望有所帮助。 – Bill

+0

错误:2和3处于相同的prepareForSeque代码中。 STLetsMeet.m - (无效)prepareForSegue:(UIStoryboardSegue *)赛格瑞发件人:(ID)发送方 { 如果([segue.destinationViewController isKindOfClass:[STStartTransport]] == YES)//错误2:预期标识符 { ((STStartTransport *)segue.destinationViewController)。委托=自我; //错误3:从不兼容类型'STLetsMeet * const_strong' } } }分配给'id '最后,您提到了以下步骤: 5.在场景1到场景2之前,将场景1设置为场景2的代表。 – user1107173

相关问题