Tôi có những gì tôi tin là một ứng dụng khá đơn giản vào lúc này dựa trên một vài hướng dẫn được trộn với nhau. Tôi đang sử dụng XCode 3.2.3 trong OSX 10.6.4. Nó bắt đầu như là một tiêu chuẩn iPhone "Window Dựa ứng dụng". Sử dụng giao diện người xây dựng tôi đã thêm một Tab Bar điều khiển bằng cách sử dụng video hướng dẫn O'Reilly ở đây:Ngoại lệ trong ứng dụng iPhone: Chuyển đổi phương thức đã được tiến hành
http://broadcast.oreilly.com/2009/06/tab-bars-and-navigation-bars-t.html
Trong Tab đầu tiên tôi có một UIView tiêu chuẩn với hai nút. Cả hai gọi chức năng tương tự để hiển thị một UIImagePickerController:
-(IBAction) btnPhotoClicked:(id)sender {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
if((UIButton *)sender == btnChoosePhoto)
{
imagePicker.allowsEditing = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
Tôi đang chạy mã bên trong một giả lập như vậy chỉ bao giờ nhấn nút gọi Chọn Ảnh. Khi đối thoại được phát hành với ảnh được chọn, chức năng này sẽ chạy:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if(imagePuzzle == nil)
{
//--- Original Image was selected ---
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerOriginalImage];
}
else {
//--- Get the edited image ---
//--- If it was successful the above valueForKey:UIImagePickerControllerEditedImage
//--- would have assigned it already.
}
}
else {
//--- Muppet selected a video
}
// Animate the picker window going away
[picker dismissModalViewControllerAnimated:YES];
ImageViewController *imageViewController = [[ImageViewController alloc] init];
imageViewController.delegate = self;
[self presentModalViewController:imageViewController animated:YES];
[imageViewController release];
}
Đây là vấn đề của tôi. Tôi đã thử nhiều hacks và iterations khác nhau nhưng đoạn code trên là cách đơn giản nhất để trình bày vấn đề. Khi imageViewController được hiển thị dưới dạng đối thoại phương thức, ngoại lệ sau được ném:
2010-07-09 15:29:29.667 Golovomka[15183:207] *** Terminating app due to uncaught
exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal
transition from <NewViewController: 0x5915f80> to <ImageViewController: 0x594a350>
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear
to know the current transition has completed'
Làm cách nào để khắc phục điều này? Tôi đã thử sự chậm trễ và các thủ thuật khác nhưng không thực sự hiểu làm thế nào tôi phải sử dụng viewDidAppear hoặc viewDidDisappear để giúp tôi. Cũng cần lưu ý là một ứng dụng rất cơ bản với một lượt xem đang tải bộ chọn sau đó hiển thị một chế độ xem khác với hình ảnh không tạo ra lỗi. Bất kỳ sự giúp đỡ nào cũng biết ơn.
Cám ơn những lời khuyên, tôi sẽ cố gắng rằng trong mã của tôi vì nó là gọn gàng hơn những gì tôi đang làm. Tôi đang đẩy chế độ xem phương thức sau khi người dùng đã chụp ảnh hoặc đã chọn ảnh. Ý tưởng ở đây là có một số xử lý hình ảnh có khả năng cường độ cao và tôi muốn hiển thị điều đó một cách khiêm tốn cho người dùng cho đến khi hoàn thành. Vì vậy, có hành động của người dùng liên quan trước khi buộc chế độ xem phương thức. Là một sang một bên, tôi cuối cùng đã giết trường hợp ngoại lệ với điều này:
– DizietOK picker.view.superview removeFromSuperview. Thực sự thực sự giải pháp xấu, trừ khi bạn thích màn hình trống cho tất cả mọi thứ sau đó! Tôi xây dựng lại các ứng dụng từ đầu cuối cùng bằng cách sử dụng một thanh điều khiển thanh điều hướng trong một ứng dụng thanh tab và làm việc tốt. Trên một lưu ý khác, giải pháp của bạn cũng làm việc. Cảm ơn bạn. Bây giờ rõ ràng hơn nhiều. Tôi đã chỉ làm điều này trong 2 ngày từ một nền C/C++/Java/Perl/bash. – Diziet