Сегментированный элемент управления для замены контроллеров представления в контроллере навигации - PullRequest
2 голосов
/ 10 августа 2010

Вот настройка моего приложения для iPhone:

У меня есть UITabBarController с 4 контроллерами представления (1 UINavigationController и 3 UIViewControllers).

При загрузке моего приложения по умолчанию используется UINavigationController, где есть сгруппированный UITableView, который дает две опции навигации, когда пользователь нажимает первую опцию, соответствующий UITableViewController (содержит список местоположений) помещается в стек.

То, что я хотел бы сделать на экране, - это иметь UISegmentedControl, который имеет две опции: «представление списка» (которое пользователь видит по умолчанию при нажатии на UIViewController) и «представление карты», которое позволит места, которые будут представлены на карте.

Я использую следующий код для создания UISegmentedControl на панели навигации:

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:segmentItems];
 [segmentedControl setSelectedSegmentIndex:0];
 [segmentedControl setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
 [segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar];
 [segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];

 [[self navigationItem] setTitleView:segmentedControl];
 [segmentedControl release];

И этот метод будет вызывать элемент управления UISegmented при изменении:

- (void) segmentAction:(id)sender
{
 UISegmentedControl *segmentControl = sender;

 if([segmentControl selectedSegmentIndex] == 0)
 {
  NSLog(@"LIST VIEW CHOSEN!");
 }
 else
 {
  NSLog(@"MAP VIEW CHOSEN!");
 }
}

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

Один из способов, которым я пытался это сделать, - это сработало, но не показалось, что это было правильным, - создать два отдельных UIViews в моем nib-файле (один для представления списка и один для представления карты), а затем используя setView: соответственно .. но тогда я подумал, не должно ли каждое из этих представлений иметь собственный контроллер и / или собственный кончик?

- (void) segmentAction:(id)sender
{
 UISegmentedControl *segmentControl = sender;

 if([segmentControl selectedSegmentIndex] == 0)
 {
  NSLog(@"LIST VIEW CHOSEN!");
  [self setView:listView]; //Declared as an UIView IBOutlet
 }
 else
 {
  NSLog(@"MAP VIEW CHOSEN!");
  [self setView:mapView]; //Declared as an UIView IBOutlet
 }
}

В некоторых полуотождественных примерах, с которыми я сталкивался, используются «removeFromSuperview» и «addSubview», и это несколько меня смутило, я относительно новичок в разработке Cocoa Touch, так что любая помощь, помогающая мне разобраться в этом, будет принята. *

Спасибо

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Я сталкивался с этим , когда искал решение той же проблемы. Кажется, работает очень хорошо для меня.

1 голос
/ 10 августа 2010

Есть несколько способов справиться с этим, если вы просто переходите между TableView (который уже находится в стеке UINavigationController) и представлением карты, которое идет с этим SPECIFIC UITableView, вы можете заставить segmentedControl отображать mapviewController модально, это presentModalViewController:. Это имеет некоторые недостатки в функциональности, но это может быть то, что вы ищете, если вид карты будет относительно простым.

Другим способом реализации этого, и, возможно, наиболее надежным способом, является наличие одного контроллера представления, который обрабатывает как представление таблицы, так и представление карты. Это идеально, если у них точно один и тот же источник данных.

Еще один способ состоит в том, чтобы иметь два контроллера представления, по одному для представления таблицы и представления карты, и буквально делать нажатия и вставки в стек контроллера навигации в вашем методе segmentAction. Пример:

- (void) segmentAction:(id)sender
{
 UISegmentedControl *segmentControl = sender;

 if([segmentControl selectedSegmentIndex] == 0)
 {
  NSLog(@"LIST VIEW CHOSEN!");
  [self.navigationController popViewControllerAnimated:YES];
[self.navigationController pushViewController:listViewController animated:YES];
 }
 else
 {
  NSLog(@"MAP VIEW CHOSEN!");
   [self.navigationController popViewControllerAnimated:YES];
[self.navigationController pushViewController:mapViewController animated:YES];
 }
}

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

0 голосов
/ 22 июня 2012
switch (self.menu.selectedSegmentIndex) 
{
    case 0 :
        // setting text to name label
        boynamelabel.text=[boysnamearray objectAtIndex:0];
        girlnamelabel.text=[girlsnamearray objectAtIndex:0];

        // setting text to percent label
        boyspercentlabel.text=[boyspercentarray objectAtIndex:0];
        girlspercentlabel.text=[girlsprecentarray objectAtIndex:0];

        // setting image to image view
        boysimage.image=[UIImage imageNamed:@"boy1.jpeg"]; 
        girlsimage.image=[UIImage imageNamed:@"girl1.jpeg"];

        break;

    case 1:
        // setting text to name label
        boynamelabel.text=[boysnamearray objectAtIndex:1];
        girlnamelabel.text=[girlsnamearray objectAtIndex:1];

        // setting text to percent label
        boyspercentlabel.text=[boyspercentarray objectAtIndex:1];
        girlspercentlabel.text=[girlsprecentarray objectAtIndex:1];

        // setting image to image view
        boysimage.image=[UIImage imageNamed:@"boy2.jpeg"]; 
        girlsimage.image=[UIImage imageNamed:@"girl2.jpeg"];

        break;

    case 2 :
        // setting text to name label
        boynamelabel.text=[boysnamearray objectAtIndex:2];
        girlnamelabel.text=[girlsnamearray objectAtIndex:2];

        // setting text to percent label
        boyspercentlabel.text=[boyspercentarray objectAtIndex:2];
        girlspercentlabel.text=[girlsprecentarray objectAtIndex:2];

        // setting image to image view
        boysimage.image=[UIImage imageNamed:@"boy3.jpeg"]; 
        girlsimage.image=[UIImage imageNamed:@"girl3.jpeg"];

        break;

    default:
        break;
}
...