Динамически объявить дочерний UiViewController в основном UiViewController - PullRequest
1 голос
/ 16 декабря 2011

В моей программе я должен объявить и использовать множественный дочерний элемент UIViewController как пользовательский элемент управления в моем основном UIViewController.Но когда я нажимаю на кнопку одного из дочерних контроллеров UIView, я получаю ошибку EXC_BAD_ACCESS.Пожалуйста, ознакомьтесь со следующей моей примерной структурой кода.

Пример 1:

//--Child-------------------------------------------------------------------
@interface subUIViewController<UIViewController>

     -(IBAction)myButtonClick:(id)Sender;

-@implementation subUiViewController

     -(IBAction)myButtonClick:(id)Sender
     {
          NSLog(@"Button Click Event.....");
     }

//---Main--------------------------------------------------------------------

@interface mainUIViewController<UIViewController>

@implementation mainUIViewController

     -(void)viewDidLoad
     {
          [super viewDidLoad];
          subUiViewController *subViewController=[[subUiViewController alloc] initWithNibNameAndArtist:@"subUiViewController" bundle:nil];
          [self.view addSubView: subViewController.view];
     }

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

Но если я объявлю с @property (retain,nonatomic) subUiViewController *subViewController в MainViewController, он работает без ошибок.Пожалуйста, смотрите следующий код.

Пример 2:

//---Child------------------------------------------------------------------
@interface subUIViewController<UIViewController>

     -(IBAction)myButtonClick:(id)Sender;

@implementation subUiViewController

     -(IBAction)myButtonClick:(id)Sender
     {
          NSLog(@"Button Click Event.....");
     }

//----Main-----------------------------------------------------------------


@interface mainUIViewController<UIViewController>
     @property(retain,nonatomic) subUiViewController *subViewController;

@implementation mainUIViewController
     @synthesize subViewController;

     -(void)viewDidLoad
     {
          [super viewDidLoad];
          subViewController=[[subUiViewController alloc] initWithNibNameAndArtist:@"subUiViewController" bundle:nil];
          [self.view addSubView: subViewController.view];
     }


//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

Я не знаю, почему Пример 1 не работает, а Пример 2 работает.Для меня мне нужно использовать пример 1, потому что мне нужно программно создать дочерний контроллер представления пользовательского интерфейса на основе Core Data Return.Не могли бы вы помочь мне указать, что не так?Как я могу динамически объявить дочерний UI View контроллер в коде?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Наконец-то я могу решить свою проблему, посмотрев предложение EricLars0n и user523234.Я ценю его.Вот способ.

@interface mainUIViewController<UIViewController>
     @property(retain,nonatomic) NSMutableArray *myViewControllers;

@implementation mainUIViewController
     @synthesize myViewControllers;

     -(void)viewDidLoad
     {
          [super viewDidLoad];

          //Sub View Controller 1
          subUiViewController *subViewController1=[[subUiViewController alloc] initWithNibName:@"subUiViewController" bundle:nil];
          [self.myViewControllers addObject:subViewController1];
          [self.view addSubView: subViewController1.view];

          //Sub View Controller 2
          subUiViewController *subViewController2=[[subUiViewController alloc] initWithNibName:@"subUiViewController" bundle:nil];
          [self.myViewControllers addObject:subViewController2];
          [self.view addSubView: subViewController2.view];
     }

Я использую один тип свойства NSMutableArray и сохраняю мои программно созданные дочерние UIViewControllers в этот NSMutableArray.Итак, у моего дочернего UiViewControllers нет возможности прекратить пока viewDidUnload.

Спасибо, ребята!

1 голос
/ 16 декабря 2011

В примере 1

subUiViewController *subViewController

перестает существовать после завершения viewDidLoad.Обычно в приложении для iPhone каждый экран является собственным контроллером представления.И если вы хотите загрузить новый screen / viewController, вы должны создать его, как вы это сделали, и либо отобразить его Модально, либо, если вы используете навигационный контроллер, поместить его в стек.

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

В зависимости от того, что вы делаете, новая возможность в iOS 5 для контроллера представления будет контроллером представления контейнерадля других контроллеров представления может быть полезно.Конкретно метод

addChildViewController:
0 голосов
/ 16 декабря 2011

Так же, как объяснил EricLarSOn.Тем не менее, в вашей ситуации, что вы можете сделать, чтобы объявить универсальный var со свойством и определить все динамически класс childviewcontroller и назначить его универсальному var, как упоминалось ранее.Например, замените ваш

@property (сохранить, неатомный) subUiViewController * subViewController;

на:

@property (сохранить, неатомный) UIViewController * myUIViewController;

А затем

subUiViewController * subViewController = [[subUiViewController alloc] initWithNibNameAndArtist: @ "subUiViewController" bundle: nil];

Добавить эту строку

subontroller =;

[выпуск subViewController];

[self.view addSubView: self.myUIViewController.view];

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