iPhone ручной просмотр / контроллеры - PullRequest
1 голос
/ 23 октября 2009

Мне было интересно, знает ли кто-нибудь какие-либо хорошие онлайн-ресурсы / учебные пособия для создания представлений и контроллеров программно, а не через конструктор интерфейса. Все, на что я смотрел, использует конструктор интерфейса и созданные перья, в то время как IB в порядке, я хотел бы иметь возможность разрабатывать их вручную (как по практическим соображениям, так и для лучшего понимания того, как все это сочетается, а не поверхностно). один вы получаете от перетаскивания вещей).

Мой опыт работы в java, и я нахожу это медленным и разочаровывающим, используя конструктор интерфейса для разработки представлений так, как я иногда делаю их в Java, то есть либо

  • сгенерируйте источник программно из модели предметной области, а затем настройте результат, если потребуется
  • использовать некоторые метаданные и / или отражения и динамически добавлять элементы управления в представление

Кроме того, после того, как я создал представление, я могу добавить его в конструктор интерфейса, чтобы сделать его доступным для использования в качестве дополнительного представления в другом представлении?

Спасибо, Вик

Ответы [ 3 ]

1 голос
/ 23 октября 2009

Метод Interface Builder создает «высушенные сублимацией» объекты, которые воссоздаются во время выполнения при инициализации объекта из NIB. Он по-прежнему выполняет те же действия alloc и init, используя объекты NSCoder для переноса объектов в память.

Если вы хотите иметь контроллер представления на основе определенного NIB, вы можете переопределить метод init по умолчанию и инициировать его на основе NIB для этого контроллера представления. Например:

@implementation MyViewController
-(id) init {
    if (self = [super initWithNibName:@"MyViewController" bundle:nil]) {
        //other setup stuff
    }
    return self;
}

И когда вы хотите отобразить MyViewController, вы просто позвоните примерно так:

- (void) showMyViewController {
    MyViewController *viewController = [[[MyViewController alloc] init] autorelease];
    [self presentModalViewController:viewController animated:YES];
}

Теперь, если вы хотите создать представление вручную, а не в Интерфейсном Разработчике, вам совсем не нужно менять метод -showMyViewController. Избавьтесь от переопределения -init и вместо этого переопределите метод -loadView вашего MyViewController, чтобы создать его программно:

- (void) loadView {
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(320,460)];
    self.view = view;
    [view release];

    //Create a button
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside];
    [myButton setTitle:@"Push Me!" forState:UIControlStateNormal];
    myButton.frame = CGRectMake(100,230,80,44);
    [self.view addSubview:myButton];
}

В этом примере показано, как создать представление и добавить к нему кнопку. Если вы хотите сохранить ссылку на нее, объявите ее так же, как если бы вы использовали NIB (без IBOutlet / IBActions) и используйте self при назначении. Например, ваш заголовок может выглядеть так:

@interface MyViewController : UIViewController {
    UIButton *myButton;
}

- (void) pressedButton;

@property (nonatomic, retain) UIButton *myButton;

@end

А твой класс:

@implementation MyViewController
@synthesize myButton;

- (void) loadView {
    //Create the view as above

    self.myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside];
    [myButton setTitle:@"Push Me!" forState:UIControlStateNormal];
    myButton.frame = CGRectMake(100,230,80,44);
    [self.view addSubview:myButton];
}

- (void) pressedButton {
    //Do something interesting here
    [[[[UIAlertView alloc] initWithTitle:@"Button Pressed" message:@"You totally just pressed the button" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK",nil] autorelease] show];
}

- (void) dealloc {
    [myButton release];
    [super dealloc];
}
0 голосов
/ 23 октября 2009

Я обычно не использую Интерфейсный конструктор слишком много для разработки iPhone. Обычно я создаю контроллер вида в коде, подобном этому

MyUIViewControllerSubclass *controller = [[MyUIViewControllerSubclass alloc] initWithNibName:nil bundle:nil];
controller.someProperty = myModel;
[self presentModalViewController:controller];
[controller release];

Или что-то в этом роде. Обычно я создаю подкласс UIViewController, и именно здесь я размещаю свои представления и тому подобное. Представления - это подклассы UIView (либо то, что Apple предоставляет, например UIButton и т. Д., Либо то, что я создал сам) Если вы прочтете как UIViewController, так и UIView, вы получите довольно хорошее представление о том, как это работает.

0 голосов
/ 23 октября 2009

У меня была такая же проблема пару месяцев назад, когда я хотел заняться разработкой iPhone в Emacs. Короче говоря: я больше не занимаюсь разработкой для iPhone:)

Я бы все же предложил вам проверить мой вопрос и некоторые полезные ответы здесь .

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