2010-06-21 2 views
9

У меня есть следующий код, чтобы создать вид и поместить его в Scrollview, чтобы ПЕЙДЖИНГ
код прекрасно работает, однако, что я не мог сделать загружается вид с пером файлаКак создать представление из файла nib в xcode?

другими словами Я хочу использовать «initWithNibName» вместо «initWithFrame»?

- (void)createPageWithColor:(UIColor *)color forPage:(int)page 
    { 
    UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(0, 300,400)]; 
     newView.backgroundColor = color; 
    [scrollView addSubview:newView]; 
    } 

Большое спасибо

+0

Если вы должны были сделать это таким образом (и, нет, но если вы), вы хотите, чтобы помнить ' [newView release] "после добавления его в' scrollView'. Ваш scrollView сохранит представление, когда он будет добавлен, поэтому он больше не принадлежит вам. –

ответ

14

Я думаю, что вам не хватает того, что вы можете установить кадр вашего нового UIView после загрузки ниба. Время загрузки/инициализации не является вашим единственным выстрелом. Я также разбиваю функцию загрузки на ее части, в приведенном ниже коде, чтобы вы могли легче видеть, что происходит.

Наблюдайте:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"yournib" 
                owner:self 
                options:nil]; 
//I'm assuming here that your nib's top level contains only the view 
//you want, so it's the only item in the array. 
UIView *myView = [nibContents objectAtIndex:0]; 
myView.frame = CGRectMake(0,0,300,400); //or whatever coordinates you need 
[scrollview addSubview:myView]; 

Не забывайте, что для того, чтобы фактически UIScrollView прокрутки, вам необходимо установить его свойство contentSize к размеру товаров внутри него, которая, вероятно, больше, чем .frame собственности самого просмотра прокрутки.

+0

То, о чем я говорю :) Спасибо, Дэн, ваше решение отлично работает, да, я изменил позиции просмотров на scrollview с чем-то вроде «scrollView.frame.size.width * page "для координатора x Еще раз спасибо, вы сделали мой день :) – ahmed

3

попробовать что-то вроде этого (взято из "iPhone Developers Cookbook", стр 174.):

UIView *newView = [[[NSBundle mainBundle] loadNibNamed:@"yournib" owner:self options:nil] lastObject]; 

Это предполагает один объект просмотра в вашем .xib, но вы можете изменить его, если ваш .xib более сложный.

+0

Отличный Джон, но мне нужно указать позицию newView, потому что я добавляю его в scrollview – ahmed

+0

Прокомментировал что-то @John N пропустил, но я пропустил, что он НЕ пропустил его. Так что неважно! –

20

Я знаю, что это старый пост, но я хотел создать UIView в виде отдельного файла и добавить xib, чтобы использовать его в нескольких местах в своем приложении (почти так же, как использовать его как пользовательскую ячейку таблицы) , И я не мог понять это правильно, но этот пост помог мне получить результат, который я хотел.

Так что если кто-то хочет сделать это таким же образом, это то, что я сделал:

Добавить это код инициализации в файле .m UIView в:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil][0]; 
    if (self) 
    { 
     self.frame = frame; 
    } 
    return self; 
} 

Затем в интерфейсе строителя/xib, вы должны назначить класс, созданный для UIView, чтобы добавить IBOutlets.

Надеюсь, что это поможет кому-то, потому что это меня немного!

+0

Спасибо @Matt W. – Meet

+2

Не нужно создавать новый CGRect, вы можете просто сделать' self.frame = frame' –

+0

Фантастически! Отличное решение! – bbrame

-1

Вы можете использовать мой простой класс https://github.com/ulian-onua/KRNNib, чтобы создать представление из файла nib одним вызовом метода.
Например, вы можете использовать KRNNib в следующем виде:

UIView *view = [KRNNib viewFromNibWithName:@"TestView"]; 
[self.view addSubview:view]; // add instantiated view as subview to view of current UIViewController 
Смежные вопросы