В 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, я пробовал все это, но он все еще не работает.
Да, вы на ложном пути, если у вас есть некоторые очень конкретные причины, чтобы не использовать Interface Builder. – zaph
Я не имел в виду неправильный путь в этом смысле, я просто имел в виду неправильный путь, чтобы выяснить мою проблему. И да, у меня есть определенная причина. – SirYakalot
Можете ли вы показать нам свой код? –