推动控制器时,对象变为Nil

时间:2014-03-25 17:04:26

标签: objective-c uiviewcontroller

我有一个第一个应用程序控制器,MAViewControllerMenu,当该控制器加载时,我已经分配了下一个控制器,imageControllerView。

- (void)viewDidAppear{
    [super viewDidAppear:(YES)];
    if (!imageControllerView)
        imageControllerView = [[self storyboard] instantiateViewControllerWithIdentifier:@"chosenImageController"];
}

然后,我从图像选择器中选择一个图像,并希望移动到下一个控制器imageControllerView,其中将显示图像。我按如下方式设置下一个窗口的图像属性:

imageControllerView.image = [[self.pageViews objectAtIndex:(centered_image_ind)] image];

这行有效,我检查了imageControllerView.image中的值。 但是,当我移动到下一个控制器imageControllerView时,我注意到imageControllerView的内存地址发生了变化,换句话说,在移动到该控制器之前我更改了imageControllerView的属性,特别是图像,当我移动到那里时重置

我没有在这里抛出代码,而是希望你能让我知道我应该提供什么。 我认为这是人们所知道的常见问题: 当从一个控制器移动到另一个控制器时,控制器的对象重新启动。

这是一个屏幕截图,可能会暗示我试图做什么

最左边的一个是我选择图片的地方,而这些图片又会进入幻灯片滚动视图。然后我点击下一步,图像应该出现在居中的ImageView

由于

enter image description here

2 个答案:

答案 0 :(得分:0)

行...

你不能“已经分配下一个视图控制器”这不起作用。完全没有必要像这样创造它。您可以完全删除imageViewController属性(或iVar)。

故事板中视图控制器之间的箭头为segues。在Interface Builder中,您可以选择一个segue并为其指定标识符。例如,您可以使用类似@"ImageViewSegue"的内容。

我猜segue已附加到Next按钮。这很好。

现在,在您的MAViewControllerMenu中,您需要使用此方法......

- (void)prepareForSegue:(UIStoryBoardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"ImageViewSegue"]) {
        // the controller is CREATED by the segue.
        // the one you create in view did load is never used
        ImageViewController *controller = segue.destinationController;
        controller.image = [[self.pageViews objectAtIndex:(centered_image_ind)] image];
    }
}

现在是另一个方向的segues ......

您似乎正在使用segues来关闭模态视图。你不能这样做。它将做的是创建一个新的视图控制器并呈现它而不是消除所呈现的视图。

即。你会去......

A -> B -> C -> B -> A -> B
// you'll now have 6 view controllers in memory
// each segue will create a fresh view controller with no values set.

你想要的是......

A -> B -> C
A -> B
A
// now you only have one view controller because the others were dismissed.
// when you dismiss a view controller it will go back to the original one.
// the original one will have all the values you set previously.

要做到这一点,你需要创建一个类似......的方法

- (IBAction)dismissView
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

然后无论您的解雇操作按钮是什么,都将其附加到此方法。

现在删除所有向后卷曲的段落。

传回信息

要将信息传递回原始视图控制器,您需要一个委托模式或类似的东西。

您可以在This random Google Search

了解有关创建委托的详情

创建类似于......的委托方法

- (void)imageViewSelectedImage:(UIImage *)image;

或类似的东西。

现在当你做prepareForSegue时,你可以......

controller.delegate = self;

并有一个方法......

- (void)imageViewSelectedImage:(UIImage *)image
{
    // save the method that has been sent back into an array or something
}

答案 1 :(得分:-1)

我可能错了,但似乎你使用segue转到你的第二个视图控制器,你的控制器实例与[[self storyboard] instantiateViewControllerWithIdentifier:@“chosenImageController”]检索的控制器实例不同是正常的。 / p>

你应该看看 - (void)prepareForSegue:(UIStoryboardSegue *)segue

(UIViewController方法)

在此方法中将image属性设置为segue目标控制器(检查segue的标识符)