【发布时间】:2012-07-11 02:07:55
【问题描述】:
我可以使用一些架构建议。我已经多次遇到以下问题,但我从未找到真正优雅的方法来解决它。
问题,尽可能在最高级别进行描述:
我有一个父类想充当多个子级的委托(都使用相同的协议),但是当子级调用父级的方法,父级不再知道是哪个子级调用。
我想使用松散耦合(委托/协议或通知)而不是直接调用。我不需要多个处理程序,因此通知似乎有些过头了。
为了说明问题,让我尝试一个超级简化的例子:
我从父视图控制器(和相应的视图)开始。我创建了三个子视图并将它们中的每一个插入到父视图中。我希望每当用户触摸其中一个孩子时通知父视图控制器。有几个选项可以通知家长:
定义协议。父级实现协议并将自己设置为每个子级的委托。当用户触摸一个子视图时,它的视图控制器调用它的委托(父)。在这种情况下,父级被通知一个视图被触摸,但它不知道是哪一个。不够好。
与 #1 相同,但定义协议中的方法也传递某种标识符。当孩子告诉它的代表它被触摸时,它也会传递一个指向它自己的指针。这样,父母就可以确切地知道触摸了哪个视图。对象传递自己的引用似乎真的很奇怪。
使用 NSNotifications。父级为三个子级中的每一个定义一个单独的方法,然后作为通知发送者为三个子级中的每一个订阅“viewWasTouched”通知。孩子们不需要将自己附加到用户字典,但他们确实需要发送带有指向自己的指针作为范围的通知。
与 #4 相同,但不是使用单独的方法,父级可以只使用一个带有 switch case 或其他分支的方法以及通知的发送者来确定采用哪条路径。
创建多个中间人类,它们充当子视图的委托,然后使用指向子视图的指针或其他一些区别因素调用父视图上的方法。这种方法似乎不可扩展。
这些方法是否被认为是最佳实践?我不能肯定地说,但感觉就像我错过了一些更明显/优雅的东西。
【问题讨论】:
标签: objective-c delegates protocols nsnotifications nsnotification