Два представления Несколько UIPickerViews Один выход - PullRequest
0 голосов
/ 15 июля 2011

У меня есть два вида для моего приложения в зависимости от того, какую ориентацию он решает, какой вид загрузить.Но IB не позволяет мне подключать два PickerView к одному и тому же OUTLET, есть ли способ назначить соединения в коде, чтобы при загрузке моего представления я назначал подключения к розетке?

Или я должен делать всеудваивается для каждого вида?

Или я должен разделить два моих вида на разные файлы пера

Пожалуйста, помогите мне в этом

Спасибо

Ответы [ 2 ]

5 голосов
/ 15 июля 2011

Хорошо, имейте в виду, что IBOutlet - это просто свойство, которое было объявлено таким образом, чтобы сделать его видимым в IB.Итак, ответ на ваш первый вопрос - да.При необходимости вы всегда можете переназначить это свойство в коде.

Я предполагаю, что у вас уже есть два IBOutlet для ваших пейзажных и портретных видов - что-то вроде этого:

@property (nonatomic, retain) IBOutlet UIView *landscapeView;
@property (nonatomic, retain) IBOutlet UIView *portraitView;

И это звучит так, как выВы выбираете соответствующий вид в willAnimateRotationToInterfaceOrientation:duration:.

Аналогичным образом, вы можете объявить два выхода для ваших видов сборщика:

@property (nonatomic, retain) IBOutlet UIPickerView *landscapePickerView;
@property (nonatomic, retain) IBOutlet UIPickerView *portraitPickerView;

Если вы пойдете по этому маршруту, я бы объявил динамическое свойствоэто всегда возвращает представление выбора для текущей ориентации.

@property (nonatomic, retain, readonly) UIPickerView *pickerView;

Вместо того, чтобы синтезировать это свойство, вы можете реализовать его следующим образом:

- (UIPickerView *) pickerView {
    if (self.landscapeView.superview) {
        return self.landscapePickerView;
    }
    else {
        return self.portraitPickerView;
    }
}

Однако, если у вас более одногоили два подпредставления, с такими параллельными свойствами, как этот беспорядок в вашем контроллере, может стать проблемой.В этом случае я бы подумал о создании пользовательского подкласса UIView, называемого чем-то вроде PickerContainer, который имеет выходы для вашего pickerView и любых других подпредставлений, к которым вам нужен доступ.Затем в IB вы можете изменить классы вашего альбомного и портретного видов на PickerContainer, и вы можете подключить каждый сборщик напрямую к его суперпредставлению.Затем в вашем контроллере вы можете просто создать одно динамическое свойство, подобное этому:

@property (nonatomic, retain, readonly) PickerContainer *pickerContainer;

- (PickerContainer *)pickerContainer {
    return (PickerContainer *)self.view;
}

, и после этого вы можете получить доступ к вашему pickerView для текущей ориентации через его контейнер, например:

[self.pickerContainer.pickerView reloadAllComponents];

РЕДАКТИРОВАТЬ: Вот как я реализовал willAnimateRotationToInterfaceOrientation:duration: в одном из моих проектов:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
        if (self.landscapeView.superview) [self.landscapeView removeFromSuperview];
        self.portraitView.center = CGPointMake(self.view.bounds.size.width / 2,
                                               self.view.bounds.size.height / 2);
        [self.view addSubview:self.portraitView];
    }
    else {
        if (self.portraitView.superview) [self.portraitView removeFromSuperview];
        self.landscapeView.center = CGPointMake(self.view.bounds.size.width / 2,
                                                self.view.bounds.size.height / 2);
        [self.view addSubview:self.landscapeView];
    }
}

Мой альбомный и портретный виды были настроены без распорок или пружин в IB, что означает, что все поля являются гибкими, ноширина и высота не.

0 голосов
/ 15 июля 2011

Я недавно применил эту концепцию в своем приложении. В таком случае вы можете назначить int каждой кнопке, которая отображает сборщик на ощупь.
Скажем, у вас есть две кнопки btn1 и btn2 . Пусть их сенсорные действия: btn1Action и btn2Action . Вы также можете иметь одну панель инструментов для обоих сборщиков. Установить видимость палитры и панели инструментов, как скрытые в XIB.

-(void)btn1Action:(id)sender
{
picker.setHidden = NO;
toolbar.setHidden = NO;
iPicker = 1;          // Declared globally
}  

-(void)btn2Action:(id)sender
{
picker.setHidden = NO;
toolbar.setHidden = NO;
iPicker = 2;          // Declared globally
}  

-(void)toolbarAction:(id)sender
{
picker.setHidden = YES;
toolbar.setHidden = YES;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{



     if(iPicker==1)
    {
      return 10;
    }
     if(iPicker == 2)
    {
        return 8;
    }


}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{

    return 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)iComponent
{

     if(iPicker==1)
    {
   // Your code

   }
    else if(iPicker == 2)
    {
        // Your code
    }


}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)iComponent
{

    else if(iPicker == 1)
    {
         // Your code

    }
    else if (iPicker == 2)
    {
        // Your code
    }
    } 

Надеюсь, это поможет.

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