【问题标题】:iOS Accessing Property in parentViewControlleriOS 访问 parentViewController 中的属性
【发布时间】:2013-02-11 00:58:46
【问题描述】:

尝试访问 parentViewController 中的方法时,我的应用程序崩溃了。这是 StoryBoard 中的布局

MainViewController = STLMMainViewController (ParentViewController)

Scene1 = STLMTimeDateViewController (ChildViewController)

这是 STLMTimeDateViewController 的代码

#import "STLMTimeDateViewController.h"
#import "STLMMainViewController.h"

@interface STLMTimeDateViewController ()
@property (nonatomic, strong) STLMMainViewController *stlmMainViewController;
@end


- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"The name of the controller %@",self.navigationController.parentViewController);

    stlmMainViewController= (STLMMainViewController *) self.parentViewController;
    [stlmMainViewController locationButtonSelected]; // This is where the App crashes
    NSLog(@"TimeDateController");
}

应用程序运行,但调用 STLMMainViewController 时,应用程序崩溃并出现以下错误:

2013-02-10 16:33:57.422 MyApp[9120:c07] The name of the controller <STLMMainViewController: 0x83850d0>
2013-02-10 16:33:57.434 MyApp[9120:c07] -[UINavigationController locationButtonSelected]: unrecognized selector sent to instance 0x8371a70

如果我删除以下行:

stlmMainViewController = (STLMMainViewController *) self.parentViewController;

然后离开

[stlmMainViewController locationButtonSelected];

应用程序运行,没有错误,但 [STLMMainViewController locationButtonSelected] 中的以下方法没有被调用(我从未看到日志):

-(void)locationButtonSelected
{
    [LocationButton setSelected:YES];
    [eatDrinkbutton setSelected:NO];
    [timeCalButton setSelected:NO];
    [carButton setSelected:NO];
    [contactButton setSelected:NO];
    NSLog(@"LocationButtonSelected Method");
}

locationButtonSelected 方法中的所有属性和方法本身都在 STLMMainViewController 的 .h 中声明,供公众访问。

谢谢

【问题讨论】:

  • Apple 开发者网站上 UIViewController 的类参考对 parentViewController 说...没有父级,此属性中的值为 nil。在 iOS 5.0 之前,如果视图没有父视图控制器并且正在呈现,则将返回呈现视图控制器。在 iOS 5 上,此行为不再发生。相反,使用presentingViewController 属性来访问呈现视图控制器。也许尝试展示ViewController

标签: ios properties parentviewcontroller childviewcontroller


【解决方案1】:

你可以试试这个:

self.stlmMainViewController= (STLMMainViewController *)self.navigationController.parentViewController;

(编辑:实际上,正如其他人刚刚指出的那样,您可能想改用presentingViewController。)

看起来您在此之前的日志消息中就已经正确了。在这种情况下,您需要导航控制器的父级。

顺便说一句,删除此行时不会崩溃的原因是因为您最终将locationButtonSelected 发送到零。这不会崩溃,但它也不会做任何事情。

【讨论】:

  • 效果很好!感谢您的代码和@Firoze Bhai 的解释。
猜你喜欢
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2013-06-20
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多