Ошибка переключения между контроллерами представления - PullRequest
0 голосов
/ 25 мая 2011

У меня возникла небольшая проблема при переключении между контроллерами представления.

Я следовал совету на этой странице:

Контроллеры представления: Как программно переключаться между представлениями?

Моя настройка следующая; У меня есть заставка с кнопкой на ней, и эта кнопка загружает мой второй контроллер представления. У меня есть представление ViewViewController в качестве корневого представления, и на кнопке написано «Загрузить веб-сайт», это событие загрузки веб-сайта, которое я хочу переключить на WebsiteViewController.

На вводном контроллере ViewViewController я настроил кнопку как IBOutlet и IBAction, что делает NSLogging отлично при нажатии, поэтому я знаю, что метод работает.

Что мне нужно, так это когда вы нажимаете «Загрузить сайт», он открывает WebsiteViewController. То, что я имею до сих пор, является кредитом вопроса выше:

IntroductionViewController.h

#import <UIKit/UIKit.h>
#import "WebsiteViewController.h"

@class WebsiteViewController;

@interface IntroductionViewController : UIViewController {
    IBOutlet UIButton *websiteButton;
    IBOutlet WebsiteViewController *websiteViewController;
}
@property (nonatomic, retain) UIButton *websiteButton;
@property (nonatomic, retain) WebsiteViewController *websiteViewController;

-(IBAction)loadWebsite:(id)sender;

@end

IntroductionViewController.m

#import "IntroductionViewController.h"

@implementation IntroductionViewController

@synthesize websiteButton;
@synthesize websiteViewController;

-(IBAction)loadWebsite:(id)sender{
    if(self.websiteViewController.view.superview == nil)
    {
        [self.view addSubview:websiteViewController.view];
    }   
}

Строка: [self.view addSubview:websiteViewController.view]; ничего не делает, но, как я уже говорил, эта функция нормально работает. Я не уверен, как поступить с этим.

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

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

Я бы также попытался представить ModalViewController, если вы не используете UINavigationController. Вот пример выделения вашего контроллера веб-просмотра и представления его как modalView:

-(IBAction)loadWebsite:(id)sender{
    WebsiteViewController *webView = [[WebsiteViewController alloc] init];
    [self.view presentModalViewController:webView animated:YES];
    [webView release];
}

Стиль перехода по умолчанию - UIModalTransitionStyleCoverVertical, но обратитесь к документации , чтобы узнать больше. Вы можете установить стиль перехода следующим образом:

webView.modalTransitionStyle = UIModalTransitionStyleCoverVertical
1 голос
/ 25 мая 2011

Возможно, вы забыли привязать IBOutlet к вашему WebsiteViewController. И для поддержки ориентации вы можете использовать

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOr‌​ientation 
 { 
      // Overriden to allow any orientation. 
      return ((interfaceOrientation==UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation==UIInterfaceOrientationLandscapeRight)); 
 }

Еще одна мысль для вашей проблемы с ориентацией, вы можете установить рамку на ваш вид, отображая как

 - [yourViewController.view setFrame:CGRectMake(0,0,1024,768)] //iPad and 
 - [yourViewController.view setFrame:CGRectMake(0,0,480,320)] //iPhone.

Может быть, это работает.

Thax.

1 голос
/ 25 мая 2011

Бьюсь об заклад, ваш объект WebsiteViewController не был создан.NSLog(@"%@", websiteViewController); Бьюсь об заклад, его ноль!: p Вам нужно создать объект - я не знаю, как это сделать с помощью конструктора интерфейсов.

В любом случае, вы используете старый способ переключения между контроллерами представления.Новый / лучший способ - использовать контроллер навигации, чтобы сделать это так:

-(IBAction)loadWebsite:(id)sender{
    [self.navigationController pushViewController:websiteViewController animated:YES];  
}

Но это не сработает, если вы не настроили контроллер навигации, чего я не знаю, какделать в конструкторе интерфейсов.Вот почему я ненавижу конструктор интерфейсов и считаю, что вы должны перестать учиться с ним!: p

Без компоновщика интерфейса это то, что вы должны сделать:

В вашем делегате приложения .h файл добавьте это вверху:

#include "IntroductionViewController.h"

Затем включите это сдругие @propertys в коде:

@property (nonatomic, retain) UINavigationController *navController;

Теперь в файле подкачки делегата приложения .m приложение завершило запуск с параметрами:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];

    // lets make the navigation controller by setting up a view controller first.
    IntroductionViewController *viewController = [[IntroductionViewController alloc] initWithNibName:nil bundle:nil];
    viewController.title = @"Home";
    navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [navController setNavigationBarHidden:NO]; // set to yes to hide the title bar
    [viewController release];

    [self.window addSubview:navController.view];

    return YES;
}

Это даст вамконтроллер навигации (вы можете легко скрыть строку заголовка ... - см. комментарии).И покажите первый контроллер вида (ВведениеViewController).

Теперь будет работать код, который я вам дал выше.[self.navigationController pushViewController:websiteViewController animated:YES];.Это дает viewController для navigationController, а navigationController сам выполняет все операции добавления и удаления представлений и тому подобное!

И вам вообще не приходилось использовать конструктор интерфейса!: p (ну ... теперь вы должны научиться создавать представления без перетаскивания!).

В любом случае ... надеюсь, это помогло.

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