2012-01-18 4 views
4

В page control sample из яблока есть ScrollView в построителе интерфейса. Он связан с соответствующим IBOutlet. Я хочу изменить код, так что все это делается программно. Я удаляю объект построителя интерфейса, я удаляю ключевое слово IBOutlet. Я выделяю и запускаю scrollView, но при запуске программы ничего не появляется.Внедрение UIScrollView программно

Я предполагаю, что это связано с тем, что мне нужно назначить его как subView для основного вида. Или я? Я до сих пор не понимаю, как все взгляды работают и взаимодействуют друг с другом. Если я делаю [self.view addSubView:ScrollView];, я получаю ошибку времени выполнения (или что-то, обычно она просто говорит что-то вроде BAD ACCESS или SIGABRT).

Что я делаю неправильно? Неужели я на неверном пути? (Только два дня в к КСН программирования, еще немного заблудился в лесу)

awakeFromNib в контроллере содержимого телефона:

- (void)awakeFromNib 
{ 
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 

// load our data from a plist file inside our app bundle 
NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"]; 
self.contentList = [NSArray arrayWithContentsOfFile:path]; 

// view controllers are created lazily 
// in the meantime, load the array with placeholders which will be replaced on demand 
NSMutableArray *controllers = [[NSMutableArray alloc] init]; 
for (unsigned i = 0; i < kNumberOfPages; i++) 
{ 
    [controllers addObject:[NSNull null]]; 
} 
self.viewControllers = controllers; 
[controllers release]; 

// a page is the width of the scroll view 
scrollView.pagingEnabled = YES; 
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height); 
scrollView.showsHorizontalScrollIndicator = NO; 
scrollView.showsVerticalScrollIndicator = NO; 
scrollView.scrollsToTop = NO; 
scrollView.delegate = self; 

pageControl.numberOfPages = kNumberOfPages; 
pageControl.currentPage = 0; 

// pages are created on demand 
// load the visible page 
// load the page on either side to avoid flashes when the user starts scrolling 
// 
[self loadScrollViewWithPage:0]; 
[self loadScrollViewWithPage:1]; 
} 

заголовочный файл:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

#import "ContentController.h" 

@interface PhoneContentController : ContentController <UIScrollViewDelegate> 
{ 
UIScrollView *scrollView; 
UIPageControl *pageControl; 
NSMutableArray *viewControllers; 

// To be used when scrolls originate from the UIPageControl 
BOOL pageControlUsed; 
} 

@property (nonatomic, retain) UIScrollView *scrollView; 
@property (nonatomic, retain) IBOutlet UIPageControl *pageControl; 

@property (nonatomic, retain) NSMutableArray *viewControllers; 

- (IBAction)changePage:(id)sender; 

@end 

AppDelegate:

#import "AppDelegate.h" 
#import "ContentController.h" 

@implementation AppDelegate 

@synthesize window, contentController; 

- (void)dealloc 
{ 
[window release]; 
[contentController release]; 

[super dealloc]; 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
NSString *nibTitle = @"PadContent"; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
{ 
    nibTitle = @"PhoneContent"; 
} 
[[NSBundle mainBundle] loadNibNamed:nibTitle owner:self options:nil]; 

[self.window addSubview:self.contentController.view]; 
[window makeKeyAndVisible]; 
} 

@end 

и scrollView был удален из xib-файла. Примечание. Это новая версия загруженной программы, в которой все, что я изменил, это удаление ключевого слова IBOutlet для scrollView, удаление прокрутки из xib и добавление выделенной строки init в awake from nib.

У меня были предложения по изменению appDelegate и изменению метода awakeFromNib на метод init, я пробовал все это, но он все еще не работает.

+1

Да, вы на ложном пути, если у вас есть некоторые очень конкретные причины, чтобы не использовать Interface Builder. – zaph

+0

Я не имел в виду неправильный путь в этом смысле, я просто имел в виду неправильный путь, чтобы выяснить мою проблему. И да, у меня есть определенная причина. – SirYakalot

+1

Можете ли вы показать нам свой код? –

ответ

2

Поскольку вы не загружая интерфейс из файла кончика пера, вы должны настроить ваш UIScrollView в ваших PhoneContentController «ы init метод:

- (id)init 
{ 
    [super init]; 

    if (self) { 
     scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 440)]; 
     pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)]; // Place it where you want it. 
     viewControllers = [[NSMutableArray alloc] init]; 

     // load our data from a plist file inside our app bundle 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"]; 
     self.contentList = [NSArray arrayWithContentsOfFile:path]; 

     // view controllers are created lazily 
     // in the meantime, load the array with placeholders which will be replaced on demand 
     NSMutableArray *controllers = [[NSMutableArray alloc] init]; 
     for (unsigned i = 0; i < kNumberOfPages; i++) 
     { 
      [controllers addObject:[NSNull null]]; 
     } 
     self.viewControllers = controllers; 
     [controllers release]; 

     // a page is the width of the scroll view 
     scrollView.pagingEnabled = YES; 
     scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height); 
     scrollView.showsHorizontalScrollIndicator = NO; 
     scrollView.showsVerticalScrollIndicator = NO; 
     scrollView.scrollsToTop = NO; 
     scrollView.delegate = self; 

     pageControl.numberOfPages = kNumberOfPages; 
     pageControl.currentPage = 0; 

     // pages are created on demand 
     // load the visible page 
     // load the page on either side to avoid flashes when the user starts scrolling 
     // 
     [self loadScrollViewWithPage:0]; 
     [self loadScrollViewWithPage:1]; 
    } 

    return self; 
} 

В вашем AppDelegate, внести следующие изменения:

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     contentController = [[PhoneContentController alloc] init]; 
    } else { 
     contentController = [[PadContentController alloc] init]; 
    } 

    [self.window addSubview:contentController.view]; 
    [window makeKeyAndVisible]; 
} 
+0

Он не сломается, но он не показывает, что он сделал, прежде чем я удалил материал. Просто пустой экран. Также мой метод init называется awakeFromNib. Это важно? – SirYakalot

+0

О, нет, извините, мой плохой. Он ломается. Я получаю EXC_BAD_ACCESS в строке добавления subview – SirYakalot

+0

@SirYakalot. Я внесла изменения в ответ, убедитесь, что вы удалили строку 'addSubview' из метода init. Я бы порекомендовал использовать 'init'instead' awakeFromNib'. –

0

вы просто положить это внутри метода awakeFromNib

scrollView=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 440)]; 

Не нужно добавлять в качестве подсмотра, потому что в телефонеContentController xib нет внутри него представлений. Как вы можете добавить как [self.view addSubView: ScrollView], потому что phoneContentController не является типом класса UIViewController. это подкласс класса ContentController, который является субклассом NSObject внутри этого проекта.

+0

спасибо, я не уверен, что полностью понимаю иерархию представлений. Также он все еще не работает. Он не разбивается, но ничего не отображается. – SirYakalot

+0

Я изменил цвет фона на красный, и экран красный, поэтому я думаю, что он отображается, но вещи, которые использовались для рисования на нем, больше не существуют, и, похоже, это не прокрутка ... там должно быть какая-то ссылка где-то отсутствует .. – SirYakalot

+0

Я сделал то же самое, и он работает правильно. Иначе у вас есть и другой код. –

0

Простой метод: Вы можете создали несколько раз, если вам нужно средство

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    int x = 0; 
    int y = 10; 
    for(int i=0; i<5; i++) 
    { 
     UIScrollView *scrollview=[[UIScrollView alloc]initWithFrame:CGRectMake(x, y, 50, 50)]; 
     scrollview.showsVerticalScrollIndicator=YES; 
     scrollview.scrollEnabled=YES; 
     scrollview.userInteractionEnabled=YES; 
     scrollview.backgroundColor = [UIColor greenColor]; 
     [self.view addSubview:scrollview]; 
     //scrollview.contentSize = CGSizeMake(50,50); 
     x=x+55; 

     //[self myscrollView]; 
    } 
} 
Смежные вопросы