2012-11-18 15 views
8

Próbowałem zaimplementować układ widoku z dwoma prostymi kontenerami obok siebie w sposób podobny do deski rozdzielczej iPada.Widok kontenera za pomocą scenorysów, interakcji i wyświetlania problemów

Przeczytałem wiele przykładów i oczywiście kontroler Apple View Controller dla kontrolerów widoku iw ogóle, ale mam najbardziej dziwny problem, który mam nadzieję, będzie miał proste wyjaśnienie.

Dodałem dwa pojemniki widokowe obok siebie, z których każdy będzie zawierał kontroler widoku o innym kolorze tła, jeden przycisk Round Rect i etykietę. Do celów testowych dodałem również przycisk Round Rect do "mainViewController".

A więc dość prosto i prosto. Każdy widok jest ładowany do widoku kontenera, jednak nie mogę wchodzić w interakcje z żadnym z nich (po kliknięciu przycisku, NIC się nie dzieje, brak niebieskiego podświetlania, więc nie jest to kwestia delegowania lub jakiekolwiek działanie z przycisków jest odbierane lub nie, ponieważ nic takiego nie jest zaimplementowane). Kliknięcie przycisku umieszczonego w "mainViewController" trzymającego dwa pojemniki działa bezbłędnie (jak zawsze miga na niebiesko). Kolejną dziwną rzeczą jest to, że kolor tła nie jest wyświetlany w widokach kontenera ?! Tylko przyciski i etykiety.

Program następująco:

pliki: ViewController.h i .m (to "mainViewController") sidebarViewController.h i .m (nic się nie zmieniło w tych plikach, UIViewController) resultsViewController.h i .m (nic się nie zmieniło w tych plikach, UIViewController) AppDelegate.h i .m (bez zmian) Storyboard

ViewController.h, wyloty utworzone i dołączone do każdego widoku kontenerowego w serii ujęć.

#import <UIKit/UIKit.h> 
#import "sidebarViewController.h" 
#import "resultsViewController.h" 

@interface ViewController : UIViewController 

@property (nonatomic, weak) IBOutlet UIView *sidebarView; 
@property (nonatomic, weak) IBOutlet UIView *resultsView; 


@end 

Identyfikator scenorysu ustawiony na obu panelach bocznych ViewController i Resultsviewcontroller w serii ujęć.

ViewController.m, wszystko odbywa się przez książkę (lub prawdopodobnie nie, ale co przynajmniej wydaje się, że dla mnie)

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize sidebarView,resultsView; 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

UIStoryboard *storyboard = self.storyboard; 
sidebarViewController *sideVC = [storyboard instantiateViewControllerWithIdentifier:@"SidebarViewController"]; 
resultsViewController *resultsVC = [storyboard instantiateViewControllerWithIdentifier:@"ResultsViewController"]; 

//sidebarViewController *sideVC = [[sidebarViewController alloc]init]; 
//rresultsViewController *resultsVC = [[resultsViewController alloc]init]; 
[self addChildViewController:sideVC]; 
sideVC.view.frame = self.sidebarView.frame; 
[self.sidebarView addSubview:sideVC.view]; 
self.sidebarView.userInteractionEnabled = YES; 
[sideVC didMoveToParentViewController:self]; 

[self addChildViewController:resultsVC]; 
resultsVC.view.frame = self.resultsView.frame; 
[self.resultsView addSubview:resultsVC.view]; 
self.resultsView.userInteractionEnabled = YES; 
[resultsVC didMoveToParentViewController:self]; 

} 

(ja miałem self.xxxxView jak również, a także miał Najpierw dodaj instrukcję addChildViewController)

Dobrze, więc podejrzewam, że ma to coś wspólnego z hierarchią widoków, widoki są "za" widokiem rootViewController, a co za tym idzie, pokazane, że nie można go kliknąć. Co (jeśli coś) trzeba zrobić w delegacie aplikacji, aby to zadziałało? Czy zrobiłem coś złego w tym kodzie?

Edycja: Odkryłem kolejną wskazówkę co może być nie tak: Kiedy wyłączyłem "Automatyczny układ" dla storyboardu, widoki pokazały się i działały (!), Ale całkowicie zniekształcone, ale teraz przynajmniej dostaję poprawny kolor tła i przyciski działają. Ktoś wie, jak to naprawić bez wyłączania automatycznego układu? ponieważ myślę, że muszę programować cały mój układ programowo? :(

Dziękujemy,

Odpowiedz

2

Wszystko, co masz kod jest niepotrzebny i jest chyba to, co jest przyczyną problemów. Po dodaniu widoki pojemnik w IB, to automatycznie tworzy te wbudowane kontrolery widoku dla Ciebie (i zmienia rozmiar ich na rozmiar widoku kontenera) Otrzymałeś te? Wszystko, co musisz zrobić, to zmienić ich klasy na klasy swoich podklasowych kontrolerów widoku.Jeśli potrzebujesz dostępu do tych kontrolerów z "głównego" kontrolera widoku, możesz uzyskać odniesienie do nich z właściwości childViewControllers.

+0

Dzięki za szybką odpowiedź. Tak, dostaję te, a te oczywiście działają po wyjęciu z pudełka, problem polega na tym, że chciałbym zmienić te widoki programowo (na inne kontrolery, które mają nowe kontrolery potomne). Nie widziałem jeszcze sposobu na zmianę "osadzenia Sequesa", więc mogę umieścić różne kontrolery na żądanie, jeśli nie są one potomkami wbudowanego kontrolera? –

+0

@AndreasKlintberg, Are sideBarViewController i resultsViewController 2 kontrolerów, które otrzymałeś automatycznie w IB, czy te, do których próbujesz się przełączyć? – rdelmar

+0

Nie są to nowe utworzone przeze mnie, ponieważ nie chciałem używać osadzonych segues (ponieważ nie można ich programować programowo, lub przynajmniej nie znalazłem jeszcze odniesienia do tego?) –

Powiązane problemy