获取堆栈上控制器的指针

Posted

技术标签:

【中文标题】获取堆栈上控制器的指针【英文标题】:Get a pointer to controller on stack 【发布时间】:2013-05-09 20:24:42 【问题描述】:

我有一个正在使用的左视图控制器(滑动菜单控制器),例如称为 LeftMenuTableViewController。

当用户注销时,会显示模态视图控制器,但 tableview 控制器会留在后台。当他们登录时,控制器会被关闭,而其他控制器会再次显示。

如何执行以下操作: 1. 检查表视图控制器是否存在于堆栈中。 2.在栈上创建一个指向这个控制器的指针而不用alloc init(创建另一个)

我需要一个指向它的指针,以便在登录后加载 tableView reloadData 方法(如果它存在于堆栈中)。

【问题讨论】:

【参考方案1】:

有几种不同的方法可以做到这一点。这仅取决于您想要实现的外观。

我认为最巧妙的方法是使用带有两个容器视图的 UIViewController,然后将登录视图控制器嵌入到一个容器视图中,并将表格视图控制器嵌入到另一个容器视图中。

在它们的视图控制器中创建对这些容器的引用后,您可以根据需要为每个容器视图设置动画,例如滑出登录视图然后将其隐藏。这样,您的“主”视图控制器将始终引用您的 tableView 控制器和登录视图控制器。

如果你不想摆脱在视图控制器之间使用模态转换的方法,我告诉你的是:

在您描述的任何地方都不存在视图控制器的“堆栈”。您必须自己创建一个,可能在应用程序委托中。

为了做到这一点,你需要在你的应用委托中创建一个你需要一个指针的视图控制器的引用,为它创建一个属性,然后合成它。它看起来像这样:

MyAppDelegate.h

@interface MyAppDelegate : UIResponder

    MyViewControllerClass *myViewController;

@property (nonatomic) MyViewControllerClass *myViewController;

MyAppDelegate.m

@synthesize myViewController;

然后,在视图控制器的 viewDidLoad 方法中......

[[[UIApplication sharedApplication] delegate] setMyViewController:self];

设置完成后,您可以通过以下方式检查是否存在指向该视图控制器的指针

if([[UIApplication sharedApplication] delegate].myViewController)

    //does exist

else

    //does not exist

要访问该视图控制器上的方法,只需说类似

[[[UIApplication sharedApplication] delegate].myviewController performMyMethod]

希望对你有所帮助。

【讨论】:

我正在寻找的实际答案是这样的: [tvc.tableView 重载数据]; -- 这给了我一个指向视图控制器的指针。我正在寻找如何创建指向已创建控制器的指针。如果您有任何其他有关如何创建指向已创建并位于堆栈上的视图控制器的指针的其他信息......即对我有用的模式堆栈或自定义堆栈的导航控制器堆栈:) 使用另一种设置方式进行编辑,更接近我认为您正在寻找的内容。 谢谢,我使用的答案在我的评论中,但我绝对可以继续使用这种方法。我想我也可以在另一个控制器上设置委托,而不是使用应用委托。

以上是关于获取堆栈上控制器的指针的主要内容,如果未能解决你的问题,请参考以下文章

Grails/Hibernate:版本控制上的空指针异常

单片机里sp是啥意思啊

视图控制器堆栈

在堆栈中嵌入 2 个或更多导航控制器

IL指令集

swift 从导航堆栈中获取以前的视图控制器