Как созданные подвиги во время выполнения взаимодействуют с контроллером представления? - PullRequest
0 голосов
/ 30 сентября 2010

В моем проекте iPhone у меня есть UIViewController, в который я добавляю экземпляр подкласса UIView. Из этого экземпляра мне нужно вернуть целое число моему контроллеру представления. Мое текущее решение состоит в том, чтобы отправить сообщение из моего экземпляра моему делегату приложения, который отправляет сообщение в контроллер представления. Это работает, но кажется немного грязным.

Могу ли я в любом случае отправить сообщение обратно на контроллер представления?

Я бы хотел иметь возможность сделать что-то вроде [super doSomething: 123];

Есть идеи?

Спасибо

Ответы [ 6 ]

2 голосов
/ 30 сентября 2010

Это то, для чего был предоставлен NSNotificationCenter.Как только вы освоите отправку и получение уведомлений, ваша передача сообщений станет намного проще.

Одна из классических вещей, с которыми сталкиваются люди, - это как получить указатель на нужный объект, чтобы сказать емуо чем-нибудь.Как, например, сказать ViewController, что два слота поддерживают резервное копирование стека UINavigationController, что пользователь только что изменил это поле данных?Таким образом, вы копаетесь в стеке, смещаясь назад на какое-то магическое число элементов в стеке, строите открытые сеттеры в полях, с которыми хотите общаться ... Это очень громоздко.

По сравнению с регистрацией в качестве получателя уведомлений водно место, а затем запускает уведомление в каком-то другом другом месте, когда данные изменяются.Это немного волшебно, после выполнения всей работы по «копанию в иерархии представлений».

1 голос
/ 30 сентября 2010

Если я правильно понимаю, вы хотите отправить сообщение из вашего подкласса UIView в контроллер представления.

Это означает, что ваш подкласс UIView должен иметь свойство или ivar, который является контроллером представления.Самый простой способ сделать это - добавить его в качестве розетки и подключить к контроллеру представления в файле пера.

1 голос
/ 30 сентября 2010

Хм, я не уверен, что правильно понял вашу проблему.У вас есть класс, производный от UIView, который должен отправить сообщение другому классу, производному от UIViewController.Похоже, вы создаете экземпляр UIView программно.Есть ли какая-то причина, по которой вы не можете иметь свойство в UIView, которое ссылается на UIVIewController, и просто использовать его для прямой отправки ему сообщения.

Вы не можете использовать [super ...], потому что super вашего производного класса UIView будет UIView.

Или я неправильно понимаю вопрос: -)

0 голосов
/ 30 сентября 2010

В моем проекте iPhone у меня есть UIViewController, в который я добавляю экземпляр подкласса UIView.

Это подразумевает, что у вас есть и ссылка на экземпляр подкласса UIViewи UIViewController в той же области.То есть что-то эквивалентное:

UIViewControllerSubclass *myViewController;
UIViewSubclass *myView;

(не имеет значения, являются ли они на самом деле переменными экземпляра или даже глобальными)

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

myViewController.view = myView;

В своем UIViewSubclass добавьте свойство, которое указывает на ваш UIViewControllerSubclass:

@property(assign) UIViewControllerSubclass *myController;

Затем, когда вы сделаете указанное выше назначение, добавьте:

myView.myController = myViewController;

Отсюда легко обмениваться сообщениями с вашим контроллером:

[self.myController yoManHereIsAnInt: 42];

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

Нет super об этом.super полностью связано с иерархией наследования ваших классов Objective-C.То, о чем вы спрашиваете, не имеет ничего общего с наследованием и связано с тем, как различные экземпляры объектов в вашем приложении связаны друг с другом.

0 голосов
/ 30 сентября 2010

Как правило, вы не должны проходить через приложение делегата.Наличие ссылки на типизированный указатель также не идеально.

Оптимальный способ общения - Apple тоже так делает - это создание протокола делегата.При создании контроллера представления вы передаете указатель на делегата как идентификатор.Затем, когда дело доходит до отправки сообщения, вы спрашиваете делегата:

if ([delegate respondsToSelector(didFinishSomething:)])
{
  [delegate didFinishSomething:info_to_pass];
}

Если вы хотите быть более сложным, вы также можете добавить указатель на экземпляр вызывающего класса.Например:

[delegate myViewController:self didFinishSomething:info_to_pass];

Таким образом, вы всегда знаете, из какого класса поступает сообщение.

Если существует более одного места, которое необходимо уведомить об изменении, вместоо делегировании вы будете использовать уведомления.

0 голосов
/ 30 сентября 2010

Просто добавьте выход к вашему подклассу UIView, подключите его к его контроллеру представления в Интерфейсном Разработчике и вызовите свой метод для этого.Вот как это может выглядеть:

MyUIView.h:

@interface MyUIView : UIView
{
  UIViewController *viewController;
}
@property (assign) IBOutlet UIViewController *viewController;
@end

MyUIView.m:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  [[self viewController] setTitle:@"Hello from MyUIView"];
}
...