Программно создавать представления в IOS (как это работает)?

Небольшой фон: я просматриваю видео в формате CS193P iTune, и я застрял в задании 3 в течение самого долгого времени. В основном, задание запрашивает у вас программное создание пользовательского представления для отображения формы на экране. Кстати, я не использую никаких контроллеров.

Мне не удалось отобразить мое представление, пока я, наконец, не перетащил объект View в Interface Builder и не изменил имя объекта в свой пользовательский класс просмотра. Поэтому мой вопрос заключается в том, когда люди говорят, что программно создают представление, просто они говорят, что вручную создают класс, но когда вам нужно отображать его, используйте IB? Я не могу не чувствовать, что я что-то не понял?

изменить: позвольте мне быть более ясным. Мое пользовательское представление было инициализировано фреймом 0, 0, 200, 150 и drawRect переопределено, чтобы нарисовать в нем квадрат. Мой просмотр даже не отображается, если попытаться добавить его в главное окно моего контроллера:

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];

Однако, если использование перетащить представление в IB и изменить класс на мой класс представления, оно отображается нормально.

Изменить: добавлен код. Это мой метод awakeFromNib моего контроллера, где нужно отобразить представление.

    - (void)awakeFromNib {
    shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
    polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    polygonView.backgroundColor = [UIColor blackColor];
    [window addSubview:polygonView];
    [self updateInterface];  
}

Часть моего контроллера updateInterface:

- (void)updateInterface {
    [polygonView setPolygon:shape];
    [polygonView setNeedsDisplay];
...
}

PolygonView.h

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

@interface PolygonView : UIView {
    IBOutlet PolygonShape *polygon; 
}

@property (readwrite, assign) PolygonShape *polygon;

- (void)drawRect:(CGRect)rect;
@end

PolygonView.m

#import "PolygonView.h"

@implementation PolygonView
@synthesize polygon;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        nslog(@"initialized");
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
       CGRect bounds = [self bounds];

    [[UIColor grayColor] set];
    UIRectFill(bounds);

    CGRect square = CGRectMake(10, 10, 10, 100);
    [[UIColor blackColor] set];
    UIRectFill(square);

    [[UIColor redColor] set];
    UIRectFill(square);
    NSLog(@"drawRect called");
}
@end

Инициализируется polygonView, но drawRect не вызывается.

Ответы

Ответ 1

Чтобы быть более конкретным для вашего вопроса, синтаксисом будет

UIWindow* window = [UIApplication sharedApplication].keyWindow;

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)];
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor];

[window addSubview:polygonView];
[polygonView release];

Это шаблон, который вы будете использовать не только для этого, но и для подзаголовков. Кроме того, еще одна заметка касается многих шаблонов, viewController уже настроен с его собственным представлением. Когда вы хотите создать пользовательский вид, вы создаете его, как указано выше, но вместо вышеописанного метода вы устанавливаете представление viewControllers на вновь созданный вид следующим образом:

viewController.view = polygonView;

Удачи!

Ответ 2

Это старый вопрос, но я не уверен, что он получил ответ, который он ожидал, - похоже, он столкнулся с той же проблемой, что и я, когда создал подкласс UIViewController, ударил UIViewController в интерфейсе builder nib, но потом не мог понять, как заставить двух работать друг с другом.

Если вы сделали nib отдельно (так что он не был создан для вас рядом с вашим классом), вы должны помнить, чтобы щелкнуть UIViewController, который вы разместили в построителе интерфейса, а затем из панели свойств нажмите кнопку третьей вкладки ( "Пользовательский класс" ). Class будет базовым классом по умолчанию UIViewController и т.д. - просто откройте этот раскрывающийся список, и вы увидите список всех ваших подклассов, выберите его и volla - вы связали свой пользовательский элемент с интерфейсом.

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

Ответ 3

Для добавления подпрограммы необходимо иметь представление (или окно). Обычный синтаксис выглядит следующим образом:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];

Конечно, если у вас есть пользовательский объект, который наследует UIView, вы должны использовать это вместо UIView. Когда вы начинаете новый проект, создайте "приложение на основе представления", которое запустит вас с помощью контроллера представления с соответствующим представлением (к которому можно получить доступ с помощью "CustomViewController.view", который заменит "mainView" в фрагменте кода выше).

Если вы хотите создать представление программно, когда приложение запустится, поместите код в метод "- (void) viewDidLoad" вашего контроллера представления.

Ответ 4

Привет, просто добавьте этот код,

[window bringSubviewToFront:polygonView];

right after,
 [window addSubview:polygonView];

Ответ 5

Где-то в вашем активном классе контроллера вы можете добавить пользовательский вид в текущий вид верхнего уровня.

[ myCurrentTopView addSubview: myNewCustomView ];

Это помогает сначала выделить и инициализировать это пользовательское представление.

Затем вы можете вызвать какой-либо чертеж в этом пользовательском представлении drawRect, выполнив:

[ myNewCustomView setNeedsDisplay ];

Ответ 6

Вы задали цвет фона вашего представления чему-то различимому?

Вы уверены, что ваше представление не отображается, или вы просто не видите его? Поместите NSLog в метод drawRect: (ваш пользовательский класс).

Ответ 7

В последнее время у меня была очень похожая проблема, и вот то, что сработало для меня: Похоже, что при запуске с "пустым приложением" в Xcode 4.3.2 вы должны установить свое представление в качестве корневого представления в главном окне, используя метод setRootViewController вместо addSubview. Итак:

// Initialize myView and then
[window setRootViewController:myView];
// instead of [window addSubview:myView];
// the rest as normal...
[window makeKeyAndVisible];

После этого вы можете использовать метод addSubview для добавления дополнительных представлений.

Ответ 8

Вызов

[super drawRect];

перед вашим пользовательским кодом в drawRect: body.

Ответ 9

UIView *parentview=[[UIView alloc]initWithFrame:CGRectMake(50, 50, 300, 300)];
parentview.backgroundColor=[UIColor orangeColor];
UIView *childview1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
childview1.backgroundColor=[UIColor blueColor];
UIView *childview2=[[UIView alloc]initWithFrame:CGRectMake(20, 20, 50, 50)];
childview1.backgroundColor=[UIColor grayColor];
[parentview addSubview:childview1];
[parentview addSubview:childview2];
[self.view addSubview:parentview];