【问题标题】:Passing data through segue via navigation controller - Objective C通过导航控制器通过segue传递数据 - Objective C
【发布时间】:2016-07-25 17:44:39
【问题描述】:

真的希望有人可以提供帮助,因为我觉得我已经尝试了在 SC 上可以找到的所有选项。首先很抱歉,如果代码混乱或者这是一个愚蠢的问题,开发不是我的强项:/

基本上,我在情节提要中创建了一个特定于 iPad 的应用程序,我有许多视图控制器和场景,并嵌入了一个导航控制器。该应用程序非常线性,它只是按顺序在每个屏幕中移动(您根本不能在应用程序内跳来跳去)。

在第一个屏幕上,用户可以通过 2 个按钮进行 2 个选择,每个按钮显示一个图像,并且他们选择的任何图像也需要显示在接下来的每个屏幕上。

当我没有嵌入导航控制器时,调用以下命令就可以正常工作:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"passSegue"] && (parentImage.hidden == NO) && (parentImage2.hidden == NO)) {
    ViewControllerGirl2 * vc = [segue destinationViewController];
    UIImage *imageView = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/1.png"]];
    UIImage *imageView2 = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/2.png"]];
    vc.parentImage = imageView;
    vc.parentImage2 = imageView2;    
}

但是现在我已经嵌入了 UINavigationController 我的图像不再出现在下一个屏幕上。我已经尝试了以下建议的方法:

UINavigationController *navController = [segue destinationViewController];
ViewControllerGirl2 *vc = (ViewControllerGirl2 *)navController.topViewController;

但我尝试实施这些建议的每一种方式都崩溃了。

任何帮助将不胜感激,因为我已经坚持了 2 天。

【问题讨论】:

  • 当它崩溃时它会说什么?我的意思是调试输出(如果有的话)?
  • 嗨@EugeneZhenyaGordin 它说:​​由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[ViewControllerGirl2 topViewController]:无法识别的选择器发送到实例0x7c9c13b0'
  • destinationViewController 是 UINavigationController 还是 ViewControllerGirl2 吗?通过断点查看调试,因为我认为您在那里进行了错误的转换....错误告诉您 ViewControllerGirl2 没有方法 topViewController,所以我假设 destinationViewController 已经是 ViewControllerGirl2
  • @EugeneZhenyaGordin 这是 ViewControllerGirl2。感谢您的反馈,非常感谢。我在导航控制器中添加的唯一原因是由于每个 VC 的模态表示上的内存分配过多,我需要一种从堆栈中删除视图控制器以释放内存的方法:/ 我确定我所做的有点傻!
  • 那么您的问题解决了吗?当您只使用没有导航控制器参考的destinationViewController 时?

标签: ios objective-c uiviewcontroller uinavigationcontroller segue


【解决方案1】:

作为一种快速的解决方法(如果您将 UINavigationController 子类化),您可以向其添加 parentImage 属性,并在为 segue 做准备的内部将您的图像值分配给导航控制器的这些属性。然后在目标视图控制器的 viewWillAppear 中,可以这样做:

self.parentImage = yourNavController.yourImageProperty1;
self.parentImage2 = yourNavController.yourImageProperty1; 

【讨论】:

  • 谢谢你,但我似乎仍然无法让准备转场正常工作,还是您建议完全取消准备转场?
【解决方案2】:

我的目标视图控制器是导航控制器。试试这个

UINavigationController *navController = [segue destinationViewController];

viewControllerGirl2 *vc2= (ShowItemsTableViewController *)([navController viewControllers][0]);

希望这对您有所帮助。 .

【讨论】:

  • 谢谢,但结果是一样的
【解决方案3】:

prepareforsegue 用于实例化控制器,而不是 UI 属性,但如果您需要设置 UI 属性,请使用父级的 viewDidLoad:

// in interface declare this
@property (nonatomic, weak) ViewControllerGirl2 *childViewController;

// in viewDidLoad
- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImage *image = [UIImage imageNamed:@"1.png"];
    self.childViewController.parentImage = image;
}

// in segue
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController isKindOfClass:[ViewControllerGirl2 class]]) {
        self. childViewController = segue.destinationViewController;
    }
}

prepareforsegue 在 vi​​ewDidLoad 之前运行,您也可以使用 viewWillAppear 代替它,但仅适用于这种情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 2020-03-20
    • 1970-01-01
    • 2017-03-23
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多