我有标准视图控制器作为它上面的模态视图控制器的委托。 此模态视图控制器包含在导航控制器中。
在呈现模态并将另一个视图控制器推送到导航堆栈之后,我想将一些数据传递回初始委托视图控制器(显示模态)。
我是否应首先将消息传递回导航堆栈到模态导航控制器的根视图控制器,然后只使用该控制器的委托方法?
OR
我是否应该将委托属性传递给嵌套视图控制器,然后直接使用单独的协议调用委托。它可以做到这一点,但我必须使用
@property (nonatomic, weak) id delegate;
而不是
@property (nonatomic, weak) id <NestedViewDelegate> delegate;
否则当我从堆栈中的预览视图控制器传递委托时,我会收到不兼容的类型错误:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NestedViewController *nest = [[NestedViewController alloc] init];
// @property id <RootViewControllerDelegate> delegate
[nest setDelegate:[self delegate]];
[[self navigationController] pushViewController:nest animated:YES];
}
这种情况的最佳做法是什么?
由于
答案 0 :(得分:0)
我会考虑使用通知来解耦这个问题。结帐NSNoticiationCenter。
您在根目录中注册通知并在您的孩子中发布。
示例强>
在您的Child对象中,您可以执行以下操作:
[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationName object:self userInfo:@{ @"key" : @"value" }]];
kMyNotificationName
在共享位置定义,如pch或Constants.h。
在Root中,您可以在init
中或者在您推动孩子的时候做这样的事情。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationName:) name:kMyNotificationName object:nil];
不要忘记删除dealloc中的观察者或弹出孩子时的观察者。
[[NSNotificationCenter defaultCenter] removeObserver:self kMyNotificationName object:nil];
现在您可以处理类似这样的通知:
- (void)myNotificationName:(NSNotification *)note
{
NSDictionary *userInfo = [note userInfo];
// Do stuff using the information passed in.
}