Концептуальный вопрос о делегировании объекта / метода iOS - PullRequest
1 голос
/ 29 июня 2011

У меня есть контроллер представления A, контроллер представления таблицы B и контроллер представления C. В методе viewDidLoad A я добавляю B в качестве подпредставления A. При касании выхода A, C отображается как модальное представление.Когда выход подключен в C;Мне нужно вызвать некоторый метод в B. Как я могу установить B в качестве делегата C, если между ними нет прямой связи?Есть ли другой способ сделать это?

Ответы [ 3 ]

6 голосов
/ 29 июня 2011

Возможно, вам придется пересмотреть свой дизайн. Если «нет прямой связи между B и C», то C не должен вызывать методы на B. Если C нуждается в вызове методов на B, тогда - это отношение ,

Тем не менее, поскольку ваш контроллер представления A знает об обоих этих объектах, он может действовать как связь между ними. Вы можете заставить C вызывать метод для A, который затем будет вызывать метод для B. Конечно, для этого требуется, чтобы C имел ссылку на A; поскольку вы говорите, что C отображается при нажатии кнопки в A, C имеет такую ​​ссылку через свойство parentViewController. Например:

// In C
- (IBAction) buttonPressed {
    [self.parentViewController passMessageToB:self];
}

// In A
- (void) passMessageToB: (id)sender {
    // sender is a reference to C, so B will be able to
    // pass information back if needed
    [B actOnMessageFromC:sender];
}

// In B
- (void) actOnMessageFromC: (id)sender {
    // Do whatever is needed
}

Можно сделать это еще более сложным - вы даже можете передать конкретный селектор A, который он может вызвать на B, но в этот момент я думаю, что вам определенно потребуется пересмотреть свой дизайн и соединения между B и C.

1 голос
/ 29 июня 2011

Как вы написали, вы можете получить доступ к обоим ( B & C ) в общем классе, то есть A .Очень просто установить B в качестве делегата для C .

Основы протоколов и делегатов.

0 голосов
/ 29 июня 2011

Вы можете сделать это следующим образом.

@interface C : UIViewController
{
    id parent;
}
@property (nonatomic,retain) id parent;

@implementation C
-(IBAction)methodInC:(id)sender
{
    [parent methodName]; //B is parent so this will call method declared in B.
}
@end

Теперь, представляя B из контроллера C, выделите объект и установите родителя как

objB.parent = self;

Таким образом, вы можете легко вызывать методыобъявлено в Б.

Надеюсь, это поможет.

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