Как настроить подпредставление UIView динамически (iPhone)? - PullRequest
1 голос
/ 22 июля 2009

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

Я помещаю подкласс UIViewController, инициализированный из кончика, в навигационный контроллер. Этот вид контроллера и это «по умолчанию» вид дисплея в порядке. Этот кончик содержит:

File's Owner [Class=my view controller subclass]
First Responder
View
--Bar Segmented Control
--View //this is the 'subview' whose content I want to toggle

Возможно, я допустил ошибку в своих торговых точках IB? Они подключены следующим образом:

switchableView <--> View
view <--> View

А где switchableView объявлено:

IBOutlet UIView *switchableView;
...
@property (nonatomic, retain)   UIView *switchableView;

Я застрял при замене содержимого этого UIView. Прежде всего, я просто хочу установить его по умолчанию, когда представление впервые появляется. Как только я это получу, переключить его на что-то другое будет легко, так как я уже могу захватить событие, сгенерированное сегментированной кнопкой. Может кто-нибудь сказать, пожалуйста, что я делаю не так?

- (void)loadView {
NSLog(@"loadView invoked");
[super loadView];
UIView *view = [[UIView alloc] init];
UILabel *label = [[UILabel alloc] init];
label.text = @"Segment1";
[view addSubview:label];
[switchableView addSubview:view]; //this is what I can't work out
[view release];
[label release];    
}

Этот метод вызывается (как и viewDidLoad), но не помогает. Я думаю, что я делаю [switchableView addSubview:view] неправильно. Я также пробовал switchableView = view, но долгое время в безопасности Java и Perl не дает мне 100% уверенности, правильно ли это попробовать или нет!

Мы надеемся, что кто-то может привести меня в порядок. Заранее спасибо,

Пол

Ответы [ 4 ]

3 голосов
/ 22 июля 2009

В конце концов это решилось после проверки примера кода UICatalog (спасибо вам обоим за несколько указателей). Следующие работы:

- (void)loadView {
    [super loadView];

    //define what will go in the seg1 view
    UILabel *mylabel = [[UILabel alloc] initWithFrame:switchableView.frame];
    mylabel.text=@"finally";
    self.seg1view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease];
    [self.seg1view addSubview:mylabel];
    [mylabel release];

    //define what will go in the seg2 view
    UILabel *mylabel2 = [[UILabel alloc] initWithFrame:switchableView.frame];
    mylabel2.text=@"it works!";
    self.seg2view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease];
    [self.seg2view addSubview:mylabel2];
    [mylabel2 release]; 

    //default the switchable view to seg1view
    [switchableView addSubview:self.seg1view];
}

-(void)doTheSwitch {
    if (segmentedButton.selectedSegmentIndex == 0) {
        [seg2view removeFromSuperview];
        [switchableView addSubview:seg1view];
    }
    if (segmentedButton.selectedSegmentIndex == 1) {    
        [seg1view removeFromSuperview];
        [switchableView addSubview:seg2view];
    }   
}

где следующие свойства также определены как свойства (сохранить, неатомные)

IBOutlet UIView *switchableView;
UIView  *seg1view;
UIView  *seg2view;
0 голосов
/ 22 июля 2009

Наиболее вероятная проблема заключается в том, что вы не устанавливаете фрейм в своих представлениях, что означает, что, пока они успешно присоединяются, они имеют размер 0x0.

Попробуйте что-то вроде:

- (void)loadView {
  NSLog(@"loadView invoked");
  [super loadView];

  CGRect labelFrame = CGRectZero;
  labelFrame.size.height = switchableView.size.height;
  labelFrame.size.width = switchableView.size.width;

  UILabel *label = [[UILabel alloc] initWithFrame:labelFrame];
  label.text = @"Segment1";
  [switchableView addSubview:label]; //this is what I can't work out
  [label release];    
}

Также удалено представление, потому что оно было бесплатным (UILabel - это UIView, вы сложили три представления, 2 из которых не имеют ничего, кроме одного подпредставления, охватывающего весь его кадр.), И оно исключило свойство представления UIViewController (в общем создавать локальные переменные с тем же именем, что и переменные экземпляра или свойства, плохо, есть предупреждения компилятора, которые можно включить, чтобы избежать этого).

0 голосов
/ 22 июля 2009

Если я правильно понимаю ваш вопрос, вы пытаетесь поменять местами одно представление. Один из способов сделать это заключается в следующем:

Добавьте UIView к корневому представлению с именем switchView. Либо в коде, либо в Интерфейсном Разработчике создайте новый UIView с именем subView1 и добавьте его в качестве подкласса switchView при загрузке корневого представления:

[switchView addSubview:subView1];

Когда пользователь переключает сегментированный элемент управления в корневом представлении, создайте новый UIView аналогичным образом с именем subView2 и переключите его с текущим подвидом switchView:

[subView1 removeFromSuperview];
[switchView addSubview:subView2];
0 голосов
/ 22 июля 2009

Вот несколько фрагментов, которые могут вам помочь. Первый - это просто инициализация контроллера навигации

// In AppDelegate.m
-(void)applicationDidFinishLaunching:(UIApplication *)application
{
  // Create and configure the main view controller.
  UIViewController *firstViewController = [[UIViewController alloc] init];

  // Add create and configure the navigation controller.
  UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
  self.navController = navigationController;
  [navigationController release];

  // Configure and display the window.
  [window addSubview:navController.view];
  [window makeKeyAndVisible];
}

Затем, когда вы будете готовы к новому просмотру, просто нажмите один там.

// Wherever you need to get your new view on there
UIViewController *secondViewController = [[UIViewController alloc] init];
[[self navigationController] pushViewController:secondViewController animated:YES];
[secondViewController release];

Вы действительно должны проходить около 5 образцов проектов Apple в день, чтобы действительно свободно владеть миром iPhone. Проверьте это для начала: TableSearch .

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