0

私はUIImagePickerControllerのインスタンスを含むUIViewControllerサブクラスを持っています。このコントローラをCameraControllerと呼ぶことにしましょう。とりわけ、CameraControllerは、UIImagePickerControllerインスタンスのoverlayView、およびUIImagePickerController(このインスタンスをphotoPickerインスタンスと呼ぶ)がモーダルコントローラとして表示されるときに表示されるその他のビュー、ボタン、ラベルなどを管理します。UIViewControllerとUIImagePickerController:期待どおりにビューを作成および管理できません

CameraPickerのカメラオーバーレイとCameraControllerビュー階層の一部であるelemetsが期待どおりに表示され、機能します。私が抱えている問題は、UIViewControllerのデフォルトイニシャライザを使用してCameraControllerのビューの階層を作成できないということです。

別のUIViewControllerからCameraControllerを初期化しています。このコントローラをWebViewControllerと呼ぶことにしましょう。ユーザーがWebViewControllerによって管理されるビューのボタンをクリックすると、launchCameraメソッドが呼び出されます。バンドル:

- (void) launchCamera{ 
    if (!cameraController) { 
     cameraController = [[CameraController alloc] init]; 

//  cameraController = [[CameraController alloc] initWithNibName:@"CameraController" 
//                 bundle:[NSBundle mainBundle]]; 
     cameraController.delegate = self;  
    } 

    [self presentModalViewController:cameraController.photoPicker animated:NO]; 
} 

は私がinitWithNibName呼び出すことによってCameraControllerを作成できるようにしたい:それは現在このように見えますが、私は説明しようとして、それは を働いていません。

CameraControllerのinitメソッドは次のようになります。

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

     // Create and configure the image picker here... 

     // Load the UI elements for the camera overlay. 
     nibContents = [[NSBundle mainBundle] loadNibNamed:@"CameraController" owner:self options:nil]; 
     [nibContents retain]; 

     photoPicker.cameraOverlayView = overlay; 

     // More initialization code here... 
    } 

    return self; 
} 

私は要素がCameraController.xibファイルから読み込むために得ることができる唯一の方法はloadNibNamed呼び出すことです:所有者:オプションを:.それ以外の場合は、カメラが引き継がれますが、オーバーレイやその他のビューコンポーネントは表示されません。この問題の副作用は、viewDidLoad、viewDidAppearなどのCameraControllerのビュー管理メソッドのどれも呼び出されていないことです。

ただし、ペン先に定義されているすべてのアウトレットが動作しているようです。例えば、カメラがロードされると、ユーザにいくつかの指示が表示されます。このビューには、それを閉じるボタンがあります。このボタンはCameraControllerで宣言され、呼び出されたメソッドはこの命令ビューを閉じます。それはすべてペン先を介して一緒に配線され、素晴らしい作品です。さらに、写真を撮るボタンは、サーバーがphotoPickerのオーバーレイとして見ることができます。このボタンと、押されたときに呼び出されるメソッドは、CameraControllerによって管理され、すべてがペン先に表示されます。それはあまりにもうまくいく。

私は何が欠けていますか?なぜUIViewControllerのデフォルト初期化子を使用してCameraControllerインスタンスを作成できないのですか?そして、CameraControllerのビュー管理メソッドのどれも今まで呼ばれていません。

ありがとうございました。

+0

を? – Oliver

+0

@Oliver - オーバーレイはUIViewのインスタンスであり、CameraControllerのメンバです。これはIBOutletとしてマークされています。 – richever

答えて

0

問題は簡単ですが、いくつかの手順が必要です。

まず、オーバーレイがIBOutletの場合、初期化時にロードすることはできません。したがって、viewDidLoadでpickerとcoを移動します。あなたの言うことがロードされていない他のすべてのアイテムもここに入れてください。それらはそこにロードされるべきです(viewDIDLoad)。アウトレットが接続されていることを確認します。

第二に、

cameraController = [[CameraController alloc] initWithNibName:@"CameraController" 
                   bundle:nil]; 

を呼び出し、CameraControllerは(単に)ビューが含まれており、CameraControllerはのUIViewControllerを継承することを確認してください。ファイルの所有者も確認してください。

そして、いくつかの時点で、あなたが呼び出すことを検討してください。

[self presentModalViewController:cameraController.photoPicker animated:NO]; 

するCameraControllerがあなたのピッカーコントロールがありません。それはあなたに理にかなっていますか?

あなたの問題に関してはどうなりますか?

あなたはいくつか混乱しているようです。私は別の方法で説明しようとしています:

ピッカーをコントロールするのはその委任者です。あなたはMAINビューでの作成を検討するかもしれません。
オーバーレイのコントローラ(サブビューとして追加されたもの)は、File's Ownerでビューを所有しています。これはMAINビューから作成し、そのビューをコントローラのサブビューとして追加することができます。基本的には、オーバーレイを取得するためにロードされますが、viewDidLoad、...は呼び出されません。
これはすべてですが、私はこれらの手順があなたのコードでOKではないと信じています。 のようなものを与える必要があること: 'オーバーレイ' は、あなたのコード内から来ているんどこ

メインコントローラ

Loadcamera { 
    self.picker = [UIImagePicker alloc] init.....]; 
    self.picker.delegate = self; 

    SecondController* scnd = [[SecondController alloc] initWithNibName:@"SecondController" bundle:nil]; 
    [self.picker addOverlay:scnd.view]; 

    [self presentModalViewController:self.picker animated:NO]; 
} 

/// And here manage your picker delegate methods 

SecondController

// Here manage your IBActions and whatever you want for the overlay 
関連する問題