UIViewController внутри другого UIviewController и IBActions - PullRequest
0 голосов
/ 14 марта 2011

Я разрабатываю приложение для iPad, в котором маленькие UIScrollViews имеют свой собственный UIViewController. Эти контроллеры имеют кнопку, которая вызывает метод IBAction. Но это не работает, на самом деле, кажется, что они не нажимаются в симуляторе.

Вот код, который даст вам представление о том, что я делаю.

// In UIViewController A (say the parent or root that have several UIScrollViews)

    MiniViewController * mini = [[MiniViewController alloc]init];
    [scrollView1 addSubview:mini.view];

//repeat the same process a couple of times with different uiscrollsviews and instances of miniviewcontrollers

Теперь MiniController очень прост, как вы можете догадаться, я публикую только файл .h

@interface MiniControlador : UIViewController {
     IBOutlet UIButton * button;
}
@property (nonatomic, retain) IBOutlet UIButton * button;
- (IBAction)doSomething:(id)sender;
@end

Вы можете видеть, что я использовал Интерфейсный конструктор для подключения «кнопки» UIButton к методу doSomething. Но, как я уже сказал, это не работает.

Еще одна вещь. Я также попытался программно добавить кнопку в UIScrollView с экземпляром Mini Controller. И это сработало! Но я, конечно, считаю, что это чрезвычайно жестко.

Что ты думаешь? Я буду признателен за любые предложения.

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Apple View Controller Руководство по программированию - это важная статья, в которой много объясняется философия Apple: «один контроллер на экран».

Большая часть поведения контроллеров представления построена на предположении, что одновременно работает только один контроллер представления.Когда это предположение нарушается, поведение не определено (или, по крайней мере, недокументировано).В этом случае ваше описание предполагает, что обычное поведение контроллера представления о вставке контроллера в цепочку респондента между его корневым представлением и суперпредставлением этого корневого каталога (обычно на предыдущем экране) не работает.

Хотя вы можете найти методы инициализации, которые работают должным образом, они не будут гарантированно работать, и поведение может измениться с будущими обновлениями ОС.

Редактировать: Aсоответствующие цитаты из Руководства по программированию View Controller:

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

1 голос
/ 18 июня 2011

Спасибо, ребята, я наконец-то решил это, используя объекты класса (который я назвал GenericViewController).На самом деле он действует как обычный UIViewController, IBActions хорошо реагирует на любое событие (например, нажатие кнопок).

Я использовал IBOutlet UIView, чтобы содержать UILabels, кнопки ... и так далее.

Вот код, если кому-то интересно.

@interface GenericViewController : NSObject {
  /* Some IBOutlets here*/

     //like a regular UIView of an UIViewController, this holds the rest of the outlets
  IBOutlet UIView * view;
  } 
   //some IBActions here
  }

Тогда UIScrollView добавляет только представление каждого объекта GenericViewController

[scrollView addSubview:genericViewControllerObject.view];

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать:)

0 голосов
/ 15 марта 2011

Вы уверены, что загружаете представление из xib, сделанного в InterfaceBuilder?
Я делаю что-то подобное в своем приложении, и оно работает для меня.
Я реализую метод init следующим образом:


- (id)init
{
    if (self = [super initWithNibName:@"__your_xib_name__" bundle:[NSBundle mainBundle]])
    {
        // TODO: Add additional initializing here
        // ...
    }

    return self;
}

Если вы не загружаете представление из xib, соединения не будут установлены (не инициализированы IBOutlets и не запущены IBActions).

...