2013-08-28 6 views
0

У меня очень странная проблема с UIScrollView и добавлены UIViewControllers. Похоже, что когда UIViewControllers добавлены в UIScrollView для подкачки, UIViewController оставляет все свои добавленные объекты.UIScrollView с удаленными объектами IUViewController

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

Я знаю, что код не перемещает добавленный UIViewController в правильный X, но в этом тесте я добавляю только один UIViewController, поэтому это не имеет значения.

Это код прокрутки .h:

#import <UIKit/UIKit.h> 
#import "TestViewController.h" 

@interface ViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl; 
@property (strong, nonatomic) NSMutableArray *scrollController; 

@end 

Это код прокрутки .m:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

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

self.scrollController = [[NSMutableArray alloc] init]; 

} 

- (void)viewDidAppear:(BOOL)animated { 

//just adding two controllers 
TestViewController *first = [[TestViewController alloc] init]; 
[self.scrollView addSubview:first.view]; 
[self.scrollController addObject:first]; 

self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * self.scrollController.count, self.scrollView.frame.size.height); 

self.pageControl.numberOfPages = [self.scrollController count]; 


} 

- (void)scrollViewDidScroll:(UIScrollView *)sender { 

// Update the page when more than 50% of the previous/next page is visible 
CGFloat pageWidth = self.scrollView.frame.size.width; 
int page = floor((self.scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 

self.pageControl.currentPage = page; 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

@end 

Это ViewController код .h:

#import <UIKit/UIKit.h> 

@interface TestViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *lblMsg; 

@end 

Это - код viewcontroller .m:

#import "TestViewController.h" 

@interface TestViewController() 

@end 

@implementation TestViewController 

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

NSLog(@"Label: %@", self.lblMsg); 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

@end 

Выход в сруба:

Label: (null) 

Любой сможет увидеть, что им делать неправильно?

ответ

0

При создании ViewController с помощью

TestViewController *first = [[TestViewController alloc] init]; 

этикетку (IBOutlet) не будет связан.

Перейдите к раскадровке в Xcode, выберите свой диспетчер представлений и назначьте уникальный идентификатор раскадровки («myIdentifier») в инспекторе идентификации в утилитах с правой стороны. Попробуйте

NSString *identifier = @"myIdentifier"; 
TestViewController *first = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 

Посмотрите документацию:

Каждый вид объекта управления является единственным владельцем своего зрения. Вы должны не связывать один и тот же объект вида с несколькими контроллерами вида объектов. Единственное исключение из этого правила заключается в том, что реализация контроллера контейнера может добавить это представление в качестве подсмотра в свою собственную иерархию представлений . Перед добавлением subview, контейнер должен сначала вызвать его метод addChildViewController: для создания отношения родитель-ребенка между двумя объектами контроллера представления.

+0

Конечно .. Я полностью пропустил эту часть. Он работает с i теперь с идентификатором раскадровки и 'TestViewController * first = [self.storyboard instantiateViewControllerWithIdentifier: identifier];'. Спасибо за помощь –

Смежные вопросы