gpt4 book ai didi

objective-c - 同一协议(protocol)的多个实例的 NSNotifications 与委托(delegate)

转载 作者:行者123 更新时间:2023-12-02 05:37:46 24 4
gpt4 key购买 nike

我可以使用一些架构建议。我已经多次遇到以下问题,但我从来没有找到一种真正优雅的方法来解决它。

问题,尽可能在最高级别描述:
我有一个父类想充当多个子类的委托(delegate)(都使用相同的协议(protocol)),但是当子级调用父级的方法,父级不再知道调用的是哪个子级。

我想使用松耦合(委托(delegate)/协议(protocol)或通知)而不是直接调用。我不需要多个处理程序,所以通知似乎有点过头了。

为了说明问题,让我试试一个 super 简化的例子:
我从父 View Controller (和相应的 View )开始。我创建了三个 subview 并将它们中的每一个插入到父 View 中。我希望在用户触摸其中一个 child 时通知父 View Controller 。有几个选项可以通知家长:

  1. 定义协议(protocol)。 parent 实现协议(protocol)并将自己设置为每个 child 的委托(delegate)。当用户触摸 subview 时,其 View Controller 调用其委托(delegate)(父 View )。在这种情况下,父级会收到一个 View 被触摸的通知,但它不知道是哪个 View 。不够好。

  2. 与 #1 相同,但在协议(protocol)中定义方法以传递某种标识符。当 child 告诉它的委托(delegate)它被触摸时,它也会传递一个指向自己的指针。这样,父级就可以确切地知道哪个 View 被触摸了。对象传递自身的引用似乎真的很奇怪。

  3. 使用 NSNotifications。父级为三个子级中的每一个定义一个单独的方法,然后作为通知发送者为三个子级中的每一个订阅“viewWasTouched”通知。 children 不需要将自己附加到用户字典,但他们确实需要发送通知,并以指向自己的指针作为范围。

  4. 与 #4 相同,但不是使用单独的方法,父级可以只使用带有 switch case 或其他分支的方法以及通知的发送者来确定采用哪条路径。

  5. 创建多个中间人类作为 subview 的委托(delegate),然后使用指向 subview 的指针或其他一些区分因素调用父 View 的方法。这种方法似乎不可扩展。

这些方法是否属于最佳实践?我不能肯定地说,但感觉我错过了一些更明显/更优雅的东西。

最佳答案

您的#2 是委托(delegate)的标准 Cocoa 模式。委托(delegate)协议(protocol)的每条消息都将对象作为第一个参数。例如,在 UITableViewDelegate 中,您会找到如下方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

当 TableView 将此消息发送给它的委托(delegate)时,它会将自己( TableView )作为第一个参数发送。如果委托(delegate)对象是多个 TableView 的委托(delegate),它可以使用第一个参数来确定哪个 TableView 发送了消息。

当没有其他参数时,消息仍然将对象作为参数,如这个 UITableViewDataSource 方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

您会在整个 Cocoa Touch 框架中发现这种模式; UIPickerViewDelegateUIImagePickerControllerDelegateUINavigationControllerDelegate 只是几个示例。

除非有令人信服的理由不这样做,否则您应该遵循标准模式。遵循约定将使其他人(以及 future 的您)更容易理解您的代码。

关于objective-c - 同一协议(protocol)的多个实例的 NSNotifications 与委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com