2010-08-22 8 views
0

我有一個簡單的iPhone應用程序。
我顯示一個UIImagePicker,並讓用戶選擇一個圖像。
然後,我在圖像上執行一些代碼,並希望此代碼在之後執行UIImagePicker已被解除。Execute code/after/UIImagePicker is dismissed

編輯:更新的代碼,問題依然存在:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSData* data = UIImagePNGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"]); 
    [[picker parentViewController] dismissModalViewControllerAnimated:TRUE]; 
    [self executeSomeCode: data]; 
} 

然而,當我運行的代碼,它掛在UIImagePicker運行我的代碼,然後將UIImagePicker視覺駁回後說的代碼有執行。

任何想法?

+0

UIImagePickerControllerOriginalImage已經被定義爲'NSString * const'(查看UIImagePickerControllerDelegate的文檔)。你不需要把它放在引號中。 – thelaws 2010-08-23 14:44:09

回答

0

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImagePickerControllerDelegate_Protocol/UIImagePickerControllerDelegate/UIImagePickerControllerDelegate.html

我相信你的呼叫IOS3

被廢棄

你可以嘗試

(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

和解聘的viewController

NSData *data = UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"] , 1.0); 
[self dismissModalViewControllerAnimated:TRUE]; 
[self executeSomeCode:img]; 
+0

,然後在解僱電話後執行我的代碼? – Origamiguy 2010-08-22 20:08:51

+0

我相信當你關閉控制器時,你會丟失數據,如果你先獲取圖像數據,那麼我相信這些問題會消失。 我得到數據,操縱它..然後關閉視圖 – 2010-08-22 20:10:05

+0

不,他沒有丟失數據,他遇到的問題是他希望在執行代碼之前將imagepicker的模態視圖關閉。他可能正在做一個他希望用戶看到的圖像的可視化動畫。正如你指出的那樣,他應該使用適當的委託方法。 – thelaws 2010-08-22 20:26:44

1

之前得到的圖像數據我意識到這不是一個最優美的nswers。我以前遇到過類似的問題(試圖在viewDidAppear中執行視覺事物,但它不起作用)。我發現通過調用performSelector:withObject:afterDelay:可以看到我的視覺效果。

所以你的情況這將是:

[self performSelector:@selector(executeSomeCode:) withObject:data afterDelay:0]; 

我不知道這是否會爲你(或爲什麼它的工作對我來說)工作。

0

我不認爲你掛在你認爲你是誰的地方。就我所知,UIImagePNGRepresentation需要相當長的時間來執行(UIJPEGRepresentation要快得多,如果你不介意沒有損失)。您可以將字典傳遞到您的方法中並獲取您需要的NSData。

你的第二個問題是你的代碼是同步的,無論你多久告訴你的控制器解僱,它都會等待你的長代碼運行。要在下次運行循環迭代中計劃繁重的代碼,並讓控制器解散,請使用0ms延遲來執行它。

我想你的代碼改成這樣:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
[[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
[self performSelector:@selector(executeSomeCode:) withObject:info afterDelay:0.0f]; 
} 
1

它不應該是必要使用一個後臺方法,但你可以試試這個方法:

- (void)_processImage:(UIImage*)image 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    // convert to PNG data here, etc. 
    // this is background, remember to manipulate UI in main thread 
    // Example: [self.anImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; 
    [pool release]; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    UIImage *picked = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    [self performSelectorInBackground:@selector(_processImage:) withObject:[[picked retain] autorelease]]; 
}