2013-11-06 3 views
13

я пытаюсь создать UIScrollView, так что я могу ударить между моими 3 контроллерами зрения. Это мой код в AppDelegate.m:Настройка UIScrollView красть между 3 контроллерами зрения

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
// Override point for customization after application launch.; 

UIScrollView *sv = [[UIScrollView alloc] init]; 

BarsViewController *bvc = [[BarsViewController alloc] init]; // Create BarsViewController 
StopwatchViewController *svc = [[StopwatchViewController alloc] init]; // Create StopwatchViewController 
TimerViewController *tvc = [[TimerViewController alloc] init]; // Create TimerViewController 

[sv addSubview:bvc.view]; 
[sv addSubview:svc.view]; 
[sv addSubview:tvc.view]; 

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; // Hide status bar 

self.window.rootViewController = sv; 
[self.window makeKeyAndVisible]; 
return YES; 
} 

Это дает ошибку на этой линии:

self.window.rootViewController = sv; 

говоря, "Несовместимые типы указателей Присваивание 'UIViewController *' от UIScrollView * '".

Однако, нет такого понятия, как UIScrollViewController, так что я не знаю, что делать.

В принципе, я просто хочу, чтобы весь экран, чтобы быть видом прокрутки, который позволяет мне красть между моими 3 контроллерами зрения. Как мне это сделать?

+0

Wenderlich имеет аналогичный учебник, сделанное на UIImageView , Попробуйте изменить UIImageView и вместо этого использовать UIViewControllers. http://www.raywenderlich.com/10518/ (под пейджинг с помощью UIScrollView) – Anil

+1

@Anil, По-видимому, это не тот случай, потому что вам следует подумать о иерархии контроллера родительского дочернего элемента. –

ответ

37

UPD: июнь, 2015 Свифта

Понятие остается тем же самым, который описан ниже в разделе Objective-C. В синтаксисе мало изменений. Чтобы добавить childviewcontroller использовать следующий фрагмент кода:

let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController; 

addChildViewController(aViewController); 
scrollView!.addSubview(aViewController.view) 
aViewController.didMoveToParentViewController(self) 

Проверьте мой Swift Github Sample Code

Objective-C

Создайте свой собственный контроллер представления пользовательского контейнера (я буду называть его combinedViewController), который будет держать вас три контроллеры в режиме прокрутки. Наследование, как всегда у UIViewController, а затем использовать addChildViewController публичный API в новом combinedViewController -viewDidLoad: так:

[self addChildViewController:aViewController]; 
[self.scrollView addSubview:aViewController.view]; 
[aViewController didMoveToParentViewController:self]; 

Вот что делает этот код:

  • Он называет addChildViewController контейнера: метод, чтобы добавить ребенок.
  • Он обращается к собственности вида ребенка, чтобы получить представление и добавляет его в свою собственную иерархию представлений. Контейнер устанавливает размер и положение ребенка перед добавлением вида; контейнеры всегда выбирают, где отображается содержимое ребенка.
  • Он явно называет ребенка didMoveToParentViewController: метод, чтобы сигнализировать о том, что операция завершена.

Выполняйте эту операцию с каждым из ваших мониторов. Впоследствии, установите combViewController как rootViewController.

, если вам нужно дальнейшие объяснения, не стесняйтесь спрашивать.

Ссылка: Design custom container view controller

Здесь мой Objective-C Github sample code

UPD: Благодаря @Oliver Аткинсон для уточнения, что addChildViewController: метод также автоматически вызывает метод willMoveToParentViewController: ребенка.

Результаты:

enter image description here

+0

Большое спасибо за этот ответ, но я немного потерялся; Я действительно очень новичок в Objective-C, и я все еще участвую. Я создал новый диспетчер представлений и импортировал файлы заголовков моих 3-х контроллеров. Я попытался скопировать код и заменить aViewController на BarsViewController, но он сказал: «Неизвестный метод класса для селектора» willMovetoViewController: », а также другие различные ошибки во всех строках. Это то, что я должен делать? Извини за это. – user2397282

+0

Извините мою ошибку, вы должны написать '-willMoveToParentViewController:' –

+0

Я тоже не работаю - он дает ту же ошибку: «Неизвестный метод класса для селектора» willMovetoParentViewController: '». Разве я не делаю это правильно? – user2397282

1
let obj1 = self.storyboard?.instantiateViewControllerWithIdentifier("DocumentsVC") as! DocumentsVC 
    let obj2 = self.storyboard?.instantiateViewControllerWithIdentifier("AppointmentsVC") as! AppointmentsVC 
    let obj3 = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardVC") as! DashboardVC 

    self.containerScrollView.frame = obj2.view.frame 

    self.containerScrollView.addSubview(obj2.view) 
    obj2.willMoveToParentViewController(self) 
    self.addChildViewController(obj2) 

    self.containerScrollView.addSubview(obj1.view) 
    obj1.willMoveToParentViewController(self) 
    self.addChildViewController(obj1) 

    self.containerScrollView.addSubview(obj3.view) 
    obj3.willMoveToParentViewController(self) 
    self.addChildViewController(obj3) 

    self.containerScrollView.contentSize = CGSizeMake(3*UIScreen.mainScreen().bounds.width, 0) 

    obj1.view.frame.origin = CGPointMake(0, 0) 
    obj2.view.frame.origin = CGPointMake(UIScreen.mainScreen().bounds.width, 0) 
    obj3.view.frame.origin = CGPointMake(2*UIScreen.mainScreen().bounds.width, 0) 
1

Swift 3,0

основе Sachin ответ - немного более общий характер - просто добавьте следующий элемент просмотров массива

var views = [ViewController(), ViewController2(), ViewController3(), ViewController4()] 

func setupScrollView() { 
    scrollView.frame = views.first!.view.frame 
    scrollView.contentSize = CGSize(width: CGFloat(views.count) * width, height: 0) 
    _ = views.map({ addViewToScrollView($0) }) 
    _ = views.map({ $0.view.frame.origin = CGPoint(x: CGFloat(views.index(of: $0)!) * width, y: 0) }) 
} 

func addViewToScrollView(_ viewController: UIViewController) { 
    scrollView.addSubview(viewController.view) 
    views.willMove(toParentViewController: self) 
    addChildViewController(viewController) 
} 
Смежные вопросы