2013-04-02 2 views
0

Я делаю игру, сделанную на C++, которую в какой-то момент хочет открыть, использовать камеру. Для этого интерфейса с Objective C класса, который представляет модальный контроллер представления:Переменные не сохраняются при изменении в обратном вызове

UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil]; 
cameraUI.allowsEditing = YES; 
cameraUI.delegate = self; 

[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:cameraUI animated:YES]; 

Этот класс предоставляет переменную состояния, чтобы позволить игре, чтобы наблюдать за ходом модальный контроллер представления. Это можно инициализировать:

State = CAMERA_ACTIVITY_WORKING; 

и актуализация функций UIImageControllerDelegate:

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker 
{ 
    State = CAMERA_ACTIVITY_CANCELED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

- (void)imagePickerController: (UIImagePickerController*) picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    State = CAMERA_ACTIVITY_IMAGECAPTURED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

Модального контроллер вида открывается и закрывается, как должно, и делегаты определенно дозвонились. Однако, когда игра опросит переменную State, она, похоже, не была обновлена, возвращая CAMERA_ACTIVITY_WORKING. Я попытался сделать переменную изменчивой, но это не повлияло.

Может ли кто-нибудь помочь?

Edit: Полный исходный код класса

.h

@interface Camera : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate> 
{ 
    volatile State State; 
    UIImage* CapturedImage; 
} 

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker; 

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

- (bool) IsAvailable; 

- (bool) Show; 

- (State) GetState; 

@end 

.m

@implementation Camera 

- (id)init 
{ 
    self = [super init]; 
    if(!self) return self; 

    State = CAMERA_ACTIVITY_WORKING; 
    CapturedImage = NULL; 

    return self; 
} 

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker 
{ 
    DEBUG_LOG("imagePickerControllerDidCancel"); 
    State = Poppet::ICameraActivity::CAMERA_ACTIVITY_CANCELED; 
    DEBUG_LOG("State: " + STRING_CAST(State)); 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

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

    State = CAMERA_ACTIVITY_IMAGECAPTURED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

- (bool) IsAvailable 
{ 
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES; 
} 


- (bool) Show 
{ 
    if(![self IsAvailable]) return false; 

    State = CAMERA_ACTIVITY_WORKING; 

    UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; //Get Image From Camera 
    cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil]; 
    cameraUI.allowsEditing = YES; 
    cameraUI.delegate = self; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:cameraUI animated:YES]; 
    return true; 
} 

- (State) GetState 
{ return State; } 

@end 
+0

сделать его сильным и проверить, не сбросили ли вы их в режиме просмотраDidAppear или viewWillAppear? потому что, поскольку imagePicker уволен, эти методы будут вызываться автоматически –

+0

Я не могу заставить государство сильным, его не ссылкой, вы имели в виду что-то еще? Я не реализую viewDidAppear или viewWillAppear – XZodia

ответ

0

Похоже, вы не используя пользовательский Camera класс.

Вы создаете класс

UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 

установить делегат и некоторые другие элементы и отображать его пользователю. Но это не экземпляр класса Camera, это пример UIImagePickerController. Я считаю, что вы хотите сделать

Camera* cameraUI = [[Camera alloc] init]; 

, который даст вам реализацию пользовательских UIViewController однако есть еще одна проблема. Ваш класс Camera не является подклассом UIImagePickerController, он является подклассом UIViewController, поэтому он не будет UIImagePickerController. Я думаю, вы намеревались это быть

@interface Camera : UIImagePickerController<UIImagePickerControllerDelegate, UINavigationControllerDelegate> 

На стороне примечание, соглашение об именовании говорит, что имена классов должны начинаться с заглавных букв. Имена методов и переменные должны начинаться с строчных букв.

Edit от комментариев:

Ваш метод Show не явился называться из любого места, так что я не знаю, как она будет использоваться. Более того, глядя на метод, я не уверен, как он будет использоваться. - в начале означает, что это метод экземпляра, который может быть вызван только для экземпляра Camera, но он используется для создания и отображения экземпляра Camera, поэтому требуется метод и экземпляр объекта для создания и отображения вновь созданного экземпляра объекта. Наверное, не то, что предназначено. Вы можете использовать +, чтобы сделать его методом класса и вызвать его с помощью [Camera Show], но вы не сможете получить доступ к переменным экземпляра, потому что они не будут существовать.

В настоящее время я не вижу где-нибудь, где Camera создается (за пределами Show) и может стать активным контроллером вида, так это выглядит, как вы только отображение общего UIImagePickerController, а не свой собственного класса.

+0

Я изменил класс Camera, чтобы наследовать от UIImagePickerController и void Show теперь использует self вместо выделения стандартного UIImagePickerController, который является улучшением кода, но, к сожалению, проблема остается. – XZodia

+0

Я нашел проблему. Когда я случайно выделил свой класс камеры дважды и проверил неправильный экземпляр. (Подобно вашему ответу, но это происходило в другом месте в коде) – XZodia

Смежные вопросы