UIViewController и UIImagePickerController: невозможно создать представления и управлять ими, как ожидается - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть подкласс UIViewController, который содержит экземпляр UIImagePickerController. Давайте назовем этот контроллер CameraController. Среди прочего CameraController управляет overlayView экземпляра UIImagePickerController и другими представлениями, кнопками, метками и т. Д., Которые отображаются, когда UIImagePickerController, назовем этот экземпляр photoPicker, отображается как модальный контроллер.

Наложение камеры PhotoPicker и элементы, являющиеся частью иерархии представления CameraController, отображаются и функционируют должным образом. Проблема в том, что я не могу использовать инициализатор UIViewController по умолчанию для создания иерархии представления CameraController.

Я инициализирую CameraController из другого UIViewController. Давайте назовем этот контроллер 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];
}  

Я хочу иметь возможность создавать CameraController, вызывая initWithNibName: bundle:, но он не работает как я объясню.

Метод инициализации CameraController выглядит следующим образом:

- (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: owner: options :. В противном случае камера начинает работать, но наложение и другие компоненты обзора не отображаются. Похоже, что побочным эффектом этой проблемы является то, что ни один из методов управления представлением в CameraController никогда не вызывается, например viewDidLoad, viewDidAppear и т. Д.

Однако все розетки, определенные в кончике, похоже, работают. Например, при загрузке камеры отображается вид с некоторыми инструкциями для пользователя. На этом представлении есть кнопка, чтобы отклонить его. Кнопка объявляется в CameraController вместе с вызываемым методом, который отклоняет это представление инструкций. Все это соединено через перо и прекрасно работает. Кроме того, кнопка для фотосъемки находится на представлении этих серверов как наложение фотопикера. Эта кнопка и метод, который вызывается при ее нажатии, управляются CameraController, и все они подключены к кончику. Он тоже отлично работает.

Так чего мне не хватает? Почему я не могу использовать инициализатор UIViewController по умолчанию для создания экземпляра CameraController. И почему ни один из методов управления представлениями CameraController никогда не вызывался.

Спасибо.

1 Ответ

0 голосов
/ 08 ноября 2011

Ваша проблема проста, но нужно несколько шагов.

Ну ... Во-первых, если оверлей является IBOutlet, он не может быть загружен во время инициализации. Так что переместите сборщик и со в viewDidLoad Поместите также сюда все другие предметы, которые, по вашему мнению, не загружены. Они должны быть загружены туда (viewDIDLoad). Убедитесь, что розетки подключены.

Во-вторых, звоните

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

и убедитесь, что CameraController содержит (просто) представление, а CameraController наследует UIViewController. Проверьте также владельца файла.

И в какой-то момент вы можете считать, что звоните:

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

не позволяет CameraController управлять вашим средством выбора. Это имеет для вас смысл?

Что это имеет отношение к вашей проблеме?

Кажется, вы что-то путаете. Я пытаюсь объяснить по-другому:

Тот, кто управляет сборщиком, является его делегатом. Вы можете рассмотреть возможность создания в ГЛАВНОМ представлении.
Контроллер оверлея (добавленный как подпредставление) - тот, которому принадлежит его представление в Владельце Файла. Это может быть создано из ОСНОВНОГО представления, добавляя его представление как подпредставление контроллера. По сути, он загружается только для того, чтобы получить оверлей, но viewDidLoad ... не будет вызываться.
Это все, и я верю, что эти шаги не подходят для вашего кода. Это должно дать что-то вроде:

MainController

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
...