【问题标题】:How do I set the parent view controller as an object so I can call one of it's method?如何将父视图控制器设置为对象,以便可以调用其中一个方法?
【发布时间】:2014-04-02 16:17:59
【问题描述】:

我需要向父视图控制器发送数据;所以(在父级中)我创建了一个方法setLocWithName: loc: 来执行此操作。如何创建作为父控制器的对象?我尝试了parentViewControllerpresentingViewController(如下所示),但我收到了警告:

使用“UIViewController *”类型的表达式初始化“TDViewController *__strong”的不兼容指针类型

// set object of parent view controller
TDViewController *tDViewController = [[self navigationController] presentingViewController];

// get data
NSArray *locs = [[PLStore sharedStore] allLocs];
PL *setselectedLoc = [locs objectAtIndex:[indexpath row]];

// send data to parent view controller 
[tDViewController setLocWithName:[setselectedLoc pLocName] loc:[setselectedLoc loc1]];

// Pop this view controller off the stack
[self.navigationController popViewControllerAnimated:YES];

【问题讨论】:

  • “父母”是什么意思?您需要描述您拥有哪些控制器,以及它们之间的关系。
  • 我只知道它是父子关系,但我有一个导航控制器(我不确定根视图的控制器是否在其之上或如何工作,但我离题了。 ) 然后根视图控制器是 TDViewcontroller 的父级(根视图控制器的“子级”)。 TDViewController 被推送到根视图控制器之上,并且这个 PLViewController 是 TDViewController 的“子”(或被推送到)
  • 好吧,这不是正确的术语,导航堆栈上的控制器彼此之间没有父子关系(我猜最好认为是兄弟姐妹)。那么,您的结构是:UINavigationController --> rootVC --> TDViewController -->PLViewController?你贴的代码是哪个控制器,PLViewController?
  • 你是对的:RootVC 将 TDVC 推在上面,然后将 PLCV 推在上面。数据和这段代码在PLVC中,DTVC有“setLocWithName loc”方法,需要数据。

标签: ios objective-c ios6 parentviewcontroller presentviewcontroller


【解决方案1】:

假设 presentingViewController(或 parentViewController?)实际上是 TDViewController 类型,您只需要在第一行进行转换:

TDViewController *tDViewController = (TDViewController *)[[self navigationController] presentingViewController];

【讨论】:

  • 是的,我试过了。它也没有用。这是否意味着视图控制器不是 TDViewController 类型?我创建了它,所以我假设它是一个 TDViewController 类型。我应该使用它的父 UIViewController 吗?
  • 你应该尝试调试你的代码,在该行设置一个断点,看看实际值是多少。
  • 我做了,我把它交给了更有经验的人。首先,我创建了一个 TDViewController 而不是分配父级。因此,代码将一直有效,直到我弹回父级并且信息不存在。现在使用 parentViewController 以及在代码中呈现 ViewController,tDViewController 返回 nil。
  • 您可以使用 isKindOfClass: 检查类型,或者检查它是否使用 respondsToSelector: 响应该选择器,但同意使用 appclay 进行此操作。
【解决方案2】:

执行此操作的正确方法是委托。 TDViewController 需要使自己成为 PLViewController 的委托,您应该在推送到 PLViewController 之前这样做。 PLViewController 应该声明一个委托协议,其中包含一个方法,该方法将您需要的两条数据传递回 TDViewController。

不过,要回答您的实际问题,您可以通过在导航堆栈上的索引 1 处获取控制器来获取对 TDViewController 的引用(在您的特定情况下)。这确实不是一个好方法,因为您可能会更改控制器的顺序,或者添加或减去控制器,但您会这样做:

TDViewController *tDViewController = (TDViewController *)[[self.navigationController viewControllers] objectAtIndex:1];

【讨论】:

  • 完美!这就像一个魅力,谢谢。我的数据仍然不存在,所以我会研究委托的事情(我真的一点也不明白),但至少内存位置匹配。你是什​​么意思“在我的特殊情况下”? 0 是 RootVC,1 是 TDVC,2 是 PLVC?
  • @user2340928,是的,0 RootVC 和 1 TDVC 使 2 PLVC 就是我所说的你的特殊情况。
  • 很好,VC 在堆栈中的位置越高,数字越大。哦,顺便说一句,感谢代表提示我让它工作了。如果有人阅读本文需要我使用的代表速成课程link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多