0

我想知道是否可以找到调用以下函数的视图

- (void)viewWillAppear:(BOOL)animated {
  //find here the name of the calling view
}

有没有办法找到哪个视图称为新视图?

4

4 回答 4

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);
}
于 2012-11-19T16:36:40.650 回答
1

好吧,如果使用导航控制器,您可以获得由以下方式推送的 viewControllers 数组:

 NSArray *array =  self.navigationController.viewControllers;

但这将为您提供已被推送的视图控制器,如果从视图返回,即从导航堆栈中弹出,它将失败,因为在这两种情况下,您

- (void)viewWillAppear:(BOOL)animated {
  //find here the name of the calling view
  }

将被调用。

于 2012-11-19T16:40:34.003 回答
1

您可以使用presentingViewController它,但问题是这将返回视图控制器的内存地址而不是指针的名称。

一种解决方案是将标签分配给呈现视图控制器的视图属性,然后在您的第二个控制器中请求该标签:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%i",[[[self presentingViewController] view] tag]);
}

在您的第一个视图控制器中:

[[self view] setTag:(someNSInteger)];
于 2012-11-19T16:46:23.463 回答
0

不用说,“视图”不会调用它,而是当您的视图出现时 iOS 会调用它。不幸的是,这很复杂,因为您可能会viewWillAppear因为其他一些视图控制器呈现该视图控制器的视图而得到这个,或者当该视图呈现的视图控制器被关闭或弹出时您可能会得到这个(取决于模态与推送)。

我们可能可以概述解决这个问题的各种复杂和复杂的方法,但我们可能应该先退后一步,问你为什么需要这样做。你真正想要达到什么目的?如果你只是想协调视图控制器之间的交互,有更好的方法来做到这一点(例如委托、设置视图控制器属性等)。


更新:

如果您想弄清楚数据是否发生了变化,而不是依赖于一些“我从哪里来”的逻辑,我个人倾向于某种机制,这些数据修改控制器或进程负责通知您的这个事实的视图控制器。

最简单的方法是使用委托设计模式,您的子视图控制器将具有一个delegate属性,该属性是指向需要了解数据更改的控制器的指针,子控制器将简单地调用该方法当数据发生变化时。在稍微复杂一点的场景中,您可能会将这种委托模式与正式的委托协议结合起来(这样子视图控制器就不需要知道父控制器的任何信息,除了它符合特定协议的事实之外),但是有些可能会说,仅在两个特定且众所周知的视图控制器之间进行通信时不需要这样做。请参阅使用委派与其他控制器通信查看控制器编程指南。

在复杂的情况下(例如,数据可能在多个地方发生变化,甚至是异步的,例如在通过 Web 服务更新期间),我将使用通知设计模式,其中视图控制器将自己添加为当数据更新时,通知中心将发送NSNotificationCenter特定通知,通知中心将被告知发布该特定通知,而观察者,您的视图控制器,将收到该通知。

于 2012-11-19T16:51:09.627 回答