我想知道是否有可能找到名为以下函数的视图
- (void)viewWillAppear:(BOOL)animated {
//find here the name of the calling view
}
有没有办法找到哪个视图称为新视图?
答案 0 :(得分:2)
在viewWillAppear中直接没有。如果它被推到UINavigationController上,你可以获得viewControllers并获得前一个。
if (self.navigationController){
NSArray* viewControllers = self.navigationControllers.viewControllers;
UIViewController* lastViewController = [viewControllers objectAtIndex:([viewControllers count] - 1)];
NSLog(@"%@ is my last ViewController before navigationg to this ViewController", lastViewController);
}
答案 1 :(得分:1)
如果使用导航控制器,您可以获得由以下方式推送的viewControllers数组:
NSArray *array = self.navigationController.viewControllers;
但这会给你视图控制器已经被推动它将失败如果从视图返回,即从导航堆栈弹出,就像在你的情况下
- (void)viewWillAppear:(BOOL)animated {
//find here the name of the calling view
}
将被召唤。
答案 2 :(得分:1)
你可以使用presentingViewController
,但问题是这将返回视图控制器的内存地址而不是指针的名称。
一种解决方案是将标记分配给呈现视图控制器的view属性,然后在第二个控制器中请求该标记:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"%i",[[[self presentingViewController] view] tag]);
}
在您的第一个视图控制器中:
[[self view] setTag:(someNSInteger)];
答案 3 :(得分:0)
毋庸置疑,“观点”不会调用此内容,而是iOS会在您的视图出现时调用此内容。不幸的是,这很复杂,因为你可能得到viewWillAppear
,因为其他一些视图控制器提供了这个视图控制器的视图,或者当这个视图提供的视图控制器被解除或弹出时你可能会得到这个(取决于模态与推送)
我们可以概述解决这个问题的各种复杂而复杂的方法,但我们应该先退后一步,然后问你为什么需要这样做。你真正想要实现的目标是什么?如果您只是尝试协调视图控制器之间的交互,那么有更好的方法(例如委托,设置视图控制器属性等)。
<强>更新强>
如果你想弄清楚数据是否已经改变,而不是依赖一些“我从哪里来”逻辑,我个人倾向于某些机制,那些数据修改控制器或过程承担责任用于通知您的视图控制器这一事实。
最简单的方法是使用delegate design pattern,您的子视图控制器将具有delegate
属性,该属性是指向需要了解数据更改的控制器的指针,当数据发生变化时,子控制器只会调用该方法。在稍微复杂的场景中,您可以将此委托模式与正式委托协议相结合(以便子视图控制器不需要知道任何有关父控制器的信息,除了它符合特定协议的事实),但有些可能会说,只需在两个特定和众所周知的视图控制器之间进行通信时就不需要这样做。请参阅 View Controller编程指南中的Using Delegation to Communicate with Other Controllers。
在复杂的情况下(例如,数据可能在各种地方甚至是异步地发生变化,例如在通过Web服务进行更新期间),我将使用notifications design pattern,其中视图控制器将自行添加作为NSNotificationCenter
发送的特定通知的观察者,每当数据更新时,通知中心将被告知发布该特定通知,反过来,观察者将收到您的观点,您的观点控制器。