所以目前我有一个tableviewcontroller,如果发生某种情况,会在loginviewcontroller上方以模态方式呈现,然后一旦用户按下一个单元格,标题就应该传递给父视图控制器。
因此图片(A)是父 - 主视图,(B)是登录,(C)是tableviewcontroller ......
C位于B顶部,位于A顶部,而不是通过导航堆叠但是通过模块堆叠。所以C除了这个之外没有任何对A的引用:- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self Login];
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
当用户按下单元格时,视图直接进入(A),因此从(C)到(A)跳过(B)。这就是我想要的......但问题是我如何将数据传递给(A)而不必再次实例化(A)?我的意思是再次实例化,它已经在应用程序启动开始时实例化,(B)如果用户尚未登录则显示在(A)上。所以(A)总是被加载,但是我如何传递数据对吗?
如果有更多信息需要提供,请通知我,我会尽快编辑。
修改 我看了几个与此相关的问题,我会使用NSNotification吗?还是代表团?我试图使用两者但没有一个真正起作用......我参考了我之前回答的有关授权实施授权解决方案的问题,但我必须在(A)中实例化(C)。但我已经在(B)中实例化了(C)。继续使用我将要使用但不会使用的解决方案:Delegation。以下是我尝试使用的NSNotification解决方案的链接:
将它放在viewDidLoad
中的父控制器中- (void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self makeCallbacks];
// get register to fetch notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(yourNotificationHandler:)
name:@"MODELVIEW DISMISS" object:nil];
}
//Now create yourNotificationHandler: like this in parent class
-(void)yourNotificationHandler:(NSNotification *)notice{
str = [notice object];
}
将以下内容放在您的子课
中- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%@", cell.textLabel.text);
// cell.textLabel.text logs this -> EDF ENRS
[[NSNotificationCenter defaultCenter] postNotificationName:@"MODELVIEW DISMISS" object:cell.textLabel.text];
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
当我记录'str'(null)打印时
现在的问题是,当我稍后在viewWillAppear中将str记录在通知之外时,它会一直返回null ....当我在通知方法中记录str时,只有DOESNT返回null ...我会试着弄清楚这一点以后但主要问题是我猜使用NSNotificationCenter解决了。
答案 0 :(得分:2)
NSNotificationCenter背后的问题不起作用,是在viewDidAppear中声明它。 确保在每次显示屏幕时出现并写入更改的位置,例如 viewWillAppear 。
然后,在 viewWillAppear 方法中对parentView进行必要的更改。
此外,请确保在发布这些通知时,在调用的方法中删除通知。
答案 1 :(得分:1)
您的通知代码应该有效,除非您在某个时间点移除了观察者。
委托也会起作用,你只需要通过实例传递委托(传递给B,B传递给C)。
块是另一种选择,类似于委托但具有块类型而不是协议。再次,通过实例传递。
块可能是您的最佳选择。如果多个项目对事件感兴趣,则应使用通知,并且这些项目不一定与事件的触发器相关联。也就是说,通知是“最少代码选项”。