关于iOS对象/方法委派的概念性问题

时间:2011-06-29 04:16:08

标签: iphone objective-c class delegates

我有视图控制器A,表视图控制器B和视图控制器C.在A的viewDidLoad方法中,我添加B作为A的子视图。当点击A中的插座时,C被呈现为模态视图。当插座插入C时;我需要在B中调用一些方法。如果两者之间没有直接关系,我怎么能将B设置为C的委托?还有另一种方法吗?

3 个答案:

答案 0 :(得分:6)

您可能需要重新考虑您的设计。如果“B和C之间没有直接关系”,则C不应该在B上调用方法。如果C 需要在B上调用方法,那么一段感情。

也就是说,由于您的视图控制器A知道这两个对象,它可以充当它们之间的链接。你可以在A上调用一个方法,然后在B上调用一个方法。当然,这要求C有一个A的引用;因为你说在A中点击按钮时会显示C,所以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
}

这可能会使这更加复杂 - 你甚至可以将一个特定的选择器传递给它可以调用B的A,但是那时我认为你肯定需要重新考虑你的设计以及B和C之间的联系。

答案 1 :(得分:1)

在你写的时候,你可以在一个公共类中访问( B& C ),即 A 。将 B 设置为 C 的代表非常容易。

The Basics of Protocols and Delegates.

答案 2 :(得分:0)

您可以按照以下方式执行此操作。

@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

现在,当从C控制器呈现B时,分配对象并将父级设置为

objB.parent = self;

这样您就可以轻松调用B中声明的方法。

希望它有所帮助。