Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 标识上一个UIView的名称_Iphone_Ios_Xcode_Uiview_Viewwillappear - Fatal编程技术网

Iphone 标识上一个UIView的名称

Iphone 标识上一个UIView的名称,iphone,ios,xcode,uiview,viewwillappear,Iphone,Ios,Xcode,Uiview,Viewwillappear,我想知道是否有可能找到调用以下函数的视图 - (void)viewWillAppear:(BOOL)animated { //find here the name of the calling view } 有没有办法找到称为新视图的视图?视图中的视图不会直接显示。如果它被推到UINavigationController上,则可以获取ViewController和上一个 if (self.navigationController){ NSArray* viewControllers = s

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

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

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

视图中的视图不会直接显示。如果它被推到UINavigationController上,则可以获取ViewController和上一个

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);
}

在视图中不会直接显示。如果它被推到UINavigationController上,则可以获取ViewController和上一个

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);
}

如果您使用导航控制器,您可以获得ViewController数组,该数组由以下命令推送:

 NSArray *array =  self.navigationController.viewControllers;
但是这会给你视图控制器,如果你从导航堆栈弹出的视图中返回,它会失败,就像在两种情况下一样

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

将被调用。

如果您使用导航控制器,则可以获得由以下命令推送的ViewController数组:

 NSArray *array =  self.navigationController.viewControllers;
但是这会给你视图控制器,如果你从导航堆栈弹出的视图中返回,它会失败,就像在两种情况下一样

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

将被调用。

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

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

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%i",[[[self presentingViewController] view] tag]);
}
[[self view] setTag:(someNSInteger)];
在第一个视图控制器中:

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

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

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

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%i",[[[self presentingViewController] view] tag]);
}
[[self view] setTag:(someNSInteger)];
在第一个视图控制器中:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%i",[[[self presentingViewController] view] tag]);
}
[[self view] setTag:(someNSInteger)];
不用说,“视图”不会调用此选项,但当您的视图出现时,iOS会调用此选项。不幸的是,这很复杂,因为您可能会得到
视图将出现
,因为其他视图控制器显示了此视图控制器的视图,或者当此视图显示的视图控制器被取消或弹出时(取决于模式与推送)

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


更新:

如果您试图弄清楚数据是否已更改,而不是依赖于某些“我从何而来”逻辑,我个人倾向于使用某种机制,在这种机制中,数据修改控制器或进程负责通知您的视图控制器这一事实

最简单的方法是使用,其中您的子视图控制器将有一个
委托
属性,该属性是指向需要了解数据更改的控制器的指针,并且当数据更改时,子控制器只需调用该方法。在稍微复杂一点的场景中,您可以将此委托模式与正式的委托协议相结合(这样子视图控制器就不需要知道有关父控制器的任何信息,只需要知道它符合特定协议的事实),但有些人可能会说,仅在两个特定且众所周知的视图控制器之间进行通信时,不需要这样做。请参见《视图控制器编程指南》中的

在复杂的情况下(例如,数据可能会在不同的位置发生更改,甚至是异步更改,例如在通过web服务进行更新的过程中),我将使用,在这种情况下,视图控制器将添加自己作为要由发送的特定通知的观察者,并且每当数据更新时,通知中心将被告知发布该特定通知,而您的视图控制器观测者将收到该通知。

不用说,“视图”不会调用该通知,而是当您的视图出现时,iOS将调用该通知。不幸的是,这很复杂,因为您可能会得到
视图将出现
,因为其他视图控制器显示了此视图控制器的视图,或者当此视图显示的视图控制器被取消或弹出时(取决于模式与推送)

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


更新:

如果您试图弄清楚数据是否已更改,而不是依赖于某些“我从何而来”逻辑,我个人倾向于使用某种机制,在这种机制中,数据修改控制器或进程负责通知您的视图控制器这一事实

最简单的方法是使用,其中您的子视图控制器将有一个
委托
属性,该属性是指向需要了解数据更改的控制器的指针,并且当数据更改时,子控制器只需调用该方法。在稍微复杂一点的场景中,您可以将此委托模式与正式的委托协议相结合(这样子视图控制器就不需要知道有关父控制器的任何信息,只需要知道它符合特定协议的事实),但有些人可能会说,仅在两个特定且众所周知的视图控制器之间进行通信时,不需要这样做。请参见《视图控制器编程指南》中的

复杂的