推送视图控制器 - 未调用viewDidAppear

时间:2011-11-07 02:44:15

标签: iphone objective-c ios uinavigationcontroller modalviewcontroller

我有这段代码来推送视图控制器:

        // Setup the animation
[self.navigationController pushViewController:self.productView animated:YES];

self.productView.imageURL = [product imageURL];

// Set the title of the view to the product's name
self.productView.title = [product name];

// Set the label text of all the labels in the view
[self.productView.caloriesL setText:[product calories]];
[self.productView.fatL setText:[product fat]];
[self.productView.saturatesL setText:[product saturates]];
[self.productView.sugarL setText:[product sugar]];
[self.productView.fibreL setText:[product fibre]];
[self.productView.saltL setText:[product salt]];

但是当productView出现时,不会调用委托方法viewDidAppear。我在google上查找了这个问题并且有很多不同的解决方案,其中没有一个我可以应用于我的问题。我在之前的解决方案中遇到了类似的问题,但我通过在viewDidLoad方法中手动调用viewDidApear来解决它。不幸的是,在这种情况下我不能这样做,因为viewDidLoad只被调用一次(在第一次推送时)。有谁知道如何解决这个问题?

谢谢,

Jack Nutkins

编辑:

这是productView(和选择器)中的viewDidAppear方法:

- (void)viewDidAppear:(BOOL)animated{
//Start animating the activity indicator
[indicator startAnimating];
//Perform this method in background
[self performSelectorInBackground:@selector(loadImage) withObject:nil];

}

- (void) loadImage {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Load the animals image into a NSData boject and then assign it to the UIImageView
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    self.imageView.image = image;

    //Stop animating the activity indicator
    [indicator stopAnimating];

    [pool drain]; //see comment below
}

2 个答案:

答案 0 :(得分:3)

首先:您绝对不希望手动调用任何标准viewWillLoadviewDidLoadviewWillAppear等方法。让操作系统为您完成。

第二:您能否告诉我们您的viewDidAppear实例中self.productView方法的实施方式? (只是预感,你不希望在你的导航控制器上调用这个方法,对吗?)我只是想确保你的方法签名完全正确。如果不是(由于拼写错误,不正确的args等),那么肯定不会被调用。

第三:我会将您的pushViewController:来电转移到您提供的其余代码之后。您不希望在屏幕上按下视图(因此用户可以看到它),然后然后会立即更改一组屏幕上的值。首先设置您的ivars和title属性,然后推送视图控制器。这消除了任何奇怪的闪烁。

答案 1 :(得分:-6)

我解决了它,虽然它似乎不常见,但我不相信我没有早点尝试过:

我把这一行:

[self.productView viewDidAppear:YES];

下面:

    // Setup the animation
[self.navigationController pushViewController:self.productView animated:YES];

我还移动了代码,将标签文本设置为在上一行之前运行。 (以及更改我的代码以将字符串发送到推送的控制器而不是访问其UI元素。)

感谢大家的帮助,

杰克