Различаются экземпляры классов, какой использовать? - PullRequest
0 голосов
/ 20 декабря 2010

Я застрял со следующим. В программе я пытаюсь установить связь между различными классами (View Controllers с файлами NIB, вложенными в приложение TabBar и т. Д.). Я хочу вызвать метод OMFG в классе с именем ProductViewDetailController. Этот класс является UIViewController (SplitViewDelegate). Он загружается программно.

В любом случае, я пытался сделать правильный вызов этому контроллеру, и я предложил 2 решения. Один из них - объявление productviewdetailcontroller в файле .h и .m вызывающего, создание IBOutlet, связывание его в компоновщике интерфейса и прямой вызов по строке

[productDetailController OMFG];

Когда я вызываю этот метод, он вызывает правильный метод в ProductViewDetailController, но экземпляр этого viewcontroller отличается от того, который я программно могу получить с помощью этого кода:

for (UIViewController *controller in self.tabBarController.viewControllers) {
      NSLog(@"%@", [controller class]);
      if ([controller isKindOfClass:[UISplitViewController class]]) {
       UISplitViewController *cell = (UISplitViewController *)controller;
       for (UIViewController *controller2 in cell.viewControllers) {
        NSLog(@"%@", [controller2 class]);
        if ([controller2 isKindOfClass:[ProductViewDetailController class]]) {
         [controller2 OMFG];

        }
       }
      }

Какой из них мне следует использовать и почему?

edit: Когда я пытаюсь добавить SubView к обоим viewcontrollers, тот, для которого вызывается [controller2 OMFG]; фактически показывает недавно добавленное представление, где [productDetailController OMFG]; не показывает недавно добавленное представление ... Почему это? Есть ли более короткий (и более изящный) способ получить доступ к нужному ViewController?

1 Ответ

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

Вы должны использовать IBOutlet. Это гарантирует, что ваше приложение может по-прежнему вызывать правильную цель, если позже вы решите изменить иерархию контроллеров представления, например, при создании совместимой с iPhone установки без UISplitViewController.

Вызов isKindOfClass: в Objective-C является верным признаком того, что вы делаете, вероятно, неправильно. Во-первых, в Cocoa Touch то, что вы делаете , всегда важнее того, кем вы являетесь . Во-вторых, вы, вероятно, пытаетесь заглянуть внутрь чего-то, что следует оставить приватным.

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