我有这段代码来推送视图控制器:
// 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
}
答案 0 :(得分:3)
首先:您绝对不希望手动调用任何标准viewWillLoad
,viewDidLoad
,viewWillAppear
等方法。让操作系统为您完成。
第二:您能否告诉我们您的viewDidAppear
实例中self.productView
方法的实施方式? (只是预感,你不希望在你的导航控制器上调用这个方法,对吗?)我只是想确保你的方法签名完全正确。如果不是(由于拼写错误,不正确的args等),那么肯定不会被调用。
第三:我会将您的pushViewController:
来电转移到您提供的其余代码之后。您不希望在屏幕上按下视图(因此用户可以看到它),然后然后会立即更改一组屏幕上的值。首先设置您的ivars和title
属性,然后推送视图控制器。这消除了任何奇怪的闪烁。
答案 1 :(得分:-6)
我解决了它,虽然它似乎不常见,但我不相信我没有早点尝试过:
我把这一行:
[self.productView viewDidAppear:YES];
下面:
// Setup the animation
[self.navigationController pushViewController:self.productView animated:YES];
我还移动了代码,将标签文本设置为在上一行之前运行。 (以及更改我的代码以将字符串发送到推送的控制器而不是访问其UI元素。)
感谢大家的帮助,
杰克