Реализация UIScrollView программно - PullRequest
4 голосов
/ 18 января 2012

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

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

Что я делаю неправильно?Я полностью на неправильном пути?(только два дня в программировании на ios, все еще немного потеряно в лесу)

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 и добавление линии alloc, init в пробуждении из nib.

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

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Поскольку вы не загружаете интерфейс из nib-файла, вам следует настроить 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 голосов
/ 14 ноября 2013

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

- (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];
    }
}
0 голосов
/ 18 января 2012

вы просто помещаете это в метод awakeFromNib

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...