Как программно переключать представления - PullRequest
0 голосов
/ 20 декабря 2009

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

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

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

Использование контроллера навигации - после того, как представление А будет удалено, мне не нужно возвращаться к нему, поэтому оно должно полностью исчезнуть и быть освобожденным из памяти.

Использование контроллера панели вкладок - та же причина, что и выше. Я бы хотел линейно перейти от А к В, а не от В к А - никогда.

Использование модального вида - на самом деле, по той же причине. Кроме того, это выглядит как UI no-no, поскольку у пользователя создается впечатление, что он возвращается к просмотру A после завершения действия в B.

Пожалуйста, помогите мне, единственное, с чем я действительно борюсь, это как выгрузить оригинальный контроллер представления, созданный как часть приложения. Я думаю, чтобы показать другое представление, все, что мне нужно сделать, это инициализировать и выделить его в представлении А, а затем добавить его в качестве подпредставления. Тем не менее, выгрузка представления A из viewcontroller A действительно сбивает меня с толку.

Редактировать: По совету кого-то из нижеприведенных мною реализовано переключение видов, но по какой-то причине removeFromSuperview не работает в представлении A после отображения представления B. По сути, я все еще могу видеть вид A за видом B (я сделал вид b немного меньше, чтобы я мог проверить это).

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

@implementation View_SwitchAppDelegate

@synthesize window;
@synthesize switchViewController;
@synthesize secondViewController;
@synthesize firstViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    FirstViewController *aFirstView = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil];
    [self setFirstViewController:aFirstView];
    [aFirstView release];
    [window addSubview:firstViewController.view];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [window release];
    [switchViewController release];
    [super dealloc];
}

- (void)switchToTwo {
    SecondViewController *aSecondView = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];
    [self setSecondViewController:aSecondView];
    [aSecondView release];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:window cache:YES];
    [firstViewController.view removeFromSuperview];

    [firstViewController release];
    firstViewController = nil;

    [self.window addSubview:[secondViewController view]];

    [window makeKeyAndVisible];
    [UIView commitAnimations];
}

@end

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

#import "FirstViewController.h"
#import "View_SwitchAppDelegate.h"
#import "SecondViewController.h"

@implementation FirstViewController

- (IBAction) takeButtonPressed 
{ 
   NSString *type = @"Camera";
    [self callCameraWithType:type];
} 
- (IBAction) chooseButtonPressed 
{ 
    NSString *type = @"Library"; 
    [self callCameraWithType:type];
} 

-(void) callCameraWithType:(NSString *)type {

    // Set up the image picker controller and add it to the view
    imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;

    if ([type isEqual:@"Camera"])
    {
        NSLog(@"Camera");
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
            imagePickerController.sourceType = 
            UIImagePickerControllerSourceTypeCamera;
        }
        else {
            imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        }
    }
    else
    {
        NSLog(@"Library");
        imagePickerController.sourceType = 
        UIImagePickerControllerSourceTypePhotoLibrary;
    }

    [self presentModalViewController:imagePickerController animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];

    //get app delegate
    View_SwitchAppDelegate *appDelegate = (View_SwitchAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate switchToTwo];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    // Dismiss the image selection and close the program
    [picker dismissModalViewControllerAnimated:YES];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    NSLog(@"View loaded");
    [super viewDidLoad];
}

- (void)removeSelf{
    [self.view removeFromSuperview];
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    NSLog(@"First Unload");
}

- (void)dealloc {
    NSLog(@"First Dealloc");
    [super dealloc];
}

@end

Ответы [ 4 ]

1 голос
/ 20 декабря 2009

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

if (firstViewController.view.superview !=nil)
 {
  if(self.secondViewController == nil)
  {
   secondViewController *secondViewController = [[secondViewController alloc] initWithNibName:@"secondSavesView" bundle:nil];
   self.secondViewController = secondViewController;
   [secondViewController release];
  }

  [firstViewController.view removeFromSuperview];
  //probably include some animation here  

[detailView insertSubview:secondViewController.view atIndex:0];
}
1 голос
/ 20 декабря 2009

вы можете попробовать вот так

[myNavigationController setViewControllers:[NSArray arrayWithObject:viewControllerB] animated:NO];
0 голосов
/ 20 декабря 2009

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

Чтобы переключить представления, просто удалите A и замените его новымПосмотреть.Вы даже можете анимировать новое представление, чтобы оно скользило отовсюду, или увеличивалось, или исчезало, или как угодно.

Это довольно тривиально, и я делаю это все время.Мой основной вид имеет строку заголовка (которая является просто UILabel) и панель инструментов (UIToolbar).Между этими двумя находится мой «документ», который можно заменить другим.

0 голосов
/ 20 декабря 2009

Что ж, если вы используете presentmodalviewcontroller и установите animated на НЕТ, у них не будет впечатления, что они возвращаются. В противном случае, я не знаю другого пути.

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