self.view insertSubView …. не должен быть self.view, но что?

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

У меня есть UIViewController, который показывает разные подклассы UIViewController. В главном UIViewController.m у меня есть подкласс под названием ‘Home’, загружаемый при запуске приложения.

Теперь, когда загрузился домашний просмотр, у меня есть кнопка, которую я хочу использовать для переключения на другой просмотр под названием ‘PreGameInfo’. Я пытаюсь использовать приведенный ниже код:

 - (IBAction)showPreGameInfo:(id)sender {
    [self.view insertSubview:preGameInfo.view atIndex:0];
}
  

Это не работает, и я знаю, это потому, что ‘self.view’ должен ссылаться на основной UIViewController, а не на self ‘Home’ view. Кто-нибудь знает, как вставить SUBVIEW в основной UIViewController при использовании UIButton во вложенном представлении???

Спасибо!

Комментарии:

1. Это очень сбивает с толку… Если вы будете следовать схеме именования, все будет намного лучше! Является ли ваш корневой контроллер просмотра классом с именем MainViewController ? Является Home UIView или UIViewController (вы должны назвать его HomeView или HomeViewController` соответственно). Аналогично, лучше назвать PreGameInfo PreGameInfoViewController .

2. Теперь вернемся к вашему вопросу. Я предполагаю, что вы не используете UINavigationController. Вы инициализировали свой PreGameInfoViewController , прежде чем пытаться добавить его представление?

Ответ №1:

Вы можете использовать delagate. Это очень просто

Итак, реализуйте это в своем контроллере представления информации;

В InformationViewController.h

 @protocol InformationViewControllerDelegate;

@interface InformationViewController : UIViewController {
    id <InformationViewControllerDelegate> delegate;
}

@property (nonatomic, assign) id <InformationViewControllerDelegate> delegate;

- (IBAction)returnBack:(id)sender;

@end

@protocol InformationViewControllerDelegate

- (void)InformationViewControllerDidFinish:(InformationViewController *)controller;

@end
  

в InformationViewController.m

 - (IBAction)returnBack:(id)sender {
    [self.delegate InformationViewControllerDidFinish:self];
}
  

И используйте делегат в любом контроллере просмотра, который вам нужен, вот так :

В HomeViewController.h

 #import "InformationViewController.h"
@interface HomeViewController : UIViewController <InformationViewControllerDelegate> {

}
  

Напишите метод, чтобы изменить представление с домашнего на информационное

 - (IBAction)goToInformationView:(id)sender;
  

В HomeViewController.m

 - (IBAction)goToInformationView:(id)sender {
    InformationViewController *controller = [[InformationViewController alloc] initWithNibName:nil bundle:nil];
    controller.delegate = self;
// You can chose the transition you want here (they are 4 see UIModalTransitionStyle)
        controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self presentModalViewController:controller animated:YES];
        [controller release];
    }
  

И последний, но не менее важный метод делегирования, он информирует HomeViewController о завершении InformationViewController

 - (void)InformationViewControllerDidFinish:(InformationViewController *)controller {
    [self dismissModalViewControllerAnimated:YES];
}
  

Я надеюсь, что это помогает

Ответ №2:

 - (IBAction)showPreGameInfo:(id)sender {
    [superview insertSubview:preGameInfo.view atIndex:0];
}
  

Ответ №3:

Работает ли этот код?

 [self.parentViewController.view addSubview:myView];
  

Комментарии:

1. Это во многом зависит от контекста, в котором вы находитесь

2. @buzzkip Сколько у вас ViewControllers? Потому что вы можете получить доступ к self.parentViewController.parentViewController.view

Ответ №4:

Просто сделайте это в modalView:

 [self presentModalViewController:preGameInfo animated:YES]
  

или вы можете сделать что-то вроде этого…

Эта строка добавит ваш новый вид в представление Windows rootViewControllers

 [self.view.window.rootViewController.view addSubview:preGameInfo.view];