使用委托设计模式允许两个对象相互通信(Apple reference)。
一般:
- 创建场景2名为委托的属性。
- 在场景2中创建一个协议,该协议定义场景2委托人必须定义的方法。
- 在从场景1到场景2继续前,将场景1设置为场景2的代表。
- 当在场景2中选择一个单元格时,向场景2的代表发送消息以通知代表该选择。
- 允许代表在选择后处理选择和解除场景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];
}
谢谢你的迅速回复。所以我遵循你的代码。误区三: 场景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没问题。这是一个编译器错误b/c编译器不知道有关STStartTransport类型(即接口声明在协议声明之后)。在协议声明之前添加@class STStartTransport,如上面编辑的版本所示。希望有所帮助。 – Bill
错误: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