概念:两个控制器使用相同的计算方法 - 委托?

时间:2014-06-01 17:44:36

标签: ios objective-c delegates protocols

我有两个甚至更多的视图控制器(A和B)使用相同的计算方法。我猜想最好的方法是将计算方法放在它自己的类中(让我们称之为C),定义一个协议就可以了。如果这是正确的,我怎么知道如何处理代表?

如果我分配/初始化C类的对象(带有calculatormethod的对象),例如在B类中,我在B类中有对象指针 - 没关系。但是如何在类A或其他类中获取对象指针(即如何告诉那些想要使用委托的控制器(即相同的计算方法),如何通过alloc / init来解决委托的问题。 B级?

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

对包含计算方法的A和B(以及任意数量的其他控制器)使用超类。通过使用超类,您不必为另一个类分配init或使用委托,所有子类都可以访问该方法。

另一种更通用的方法是在UIViewController上实现一个类别来添加计算方法。这样,任何来自UIViewController(UITableViewController,UICollectionViewController等)的控制器都可以访问该方法。

编辑后:

我在你的评论中看到你的计算与控制器无关,只是某种算法,所以UIViewController的类别或子类可能不是最好的方法。如果你想在另一个类中执行它,任何需要使用它的控制器都可以实例化该类的实例,将自己设置为委托,并通过委托方法获取结果(即,如果你甚至需要一个委托 - 如果计算速度很快,那么您只需从方法返回结果而不是使用委托)。在控制器返回结果后,应该释放实例。您不必担心哪个控制器设置了委托,因为每个控制器都创建自己的计算类实例,并将自己设置为委托。我将这种结构用于需要从多个控制器从服务器下载的应用程序。下载类被实例化,它的工作,在委托方法中发回结果,然后被取消分配。只要它需要做它的工作,它只会坚持下去。

答案 1 :(得分:0)

你所说的是A类和B类都有一个共同的依赖关系(可能是C类或简单的协议C)。 A和B不需要知道它们如何被实例化,他们只需要知道它们最终会被提供实例(协议)C。 另一个重要的事情是,你可能不希望C被A或B的强引用所持有。

我会看看哪个F类有责任实例化A和B. 此类(可以描述为工厂)的职责也可以是为A和B提供C实例的实例。

那么我会做什么:定义一个"工厂"具有构建A和B实例的方法的类 这些方法中的每一个也将提供C实例。如果您希望共享它,则此C实例可以是工厂类的属性(或者此工厂类也可以从可用C实例池中选择C实例)。

更新:如果您使用故事板来实例化控制器,则不实用。在这种情况下,您可能希望使用其他给定的答案或将您的共享计算函数实现为单例类C的方法(例如,请参阅How to pass object between several views in storyboard, iOS Dev

答案 2 :(得分:0)

  

我有两个甚至更多的视图控制器(A和B)使用相同的计算方法。

除非这是用于计算视图布局,否则它可能表示您有MVC违规。视图控制器通常不应计算任何内容。他们的工作是管理用户交互。数据和计算属于模型。

如果它是一个正确的视图控制器计算(如管理布局),那么你想要一个委托是正确的。 “代表团”是Cocoa倾向于称之为战略模式的东西。您将算法移动到另一个对象中,这样您就可以在不改变其余代码的情况下改变算法。

因此,在一种情况下,您需要访问某些模型对象,而在另一种情况下,您需要访问某个委托。在任何一种情况下,解决方案都可以类似。我会像你一样称之为“C”。

一个解决方案,特别是你正在使用故事板,是在故事板中创建“C”并用IBOutlet连接它。您可以在故事板中创建任何您喜欢的对象。只需拖出一个“对象”并将其类设置为适当的类。将它连接起来就像其他任何东西一样。(这是一种常用于OS X上的多视图nib文件的技术,我记得转换到了Storyboard,但它不适用于跨目录共享对象场景,只在场景中;所以它在iOS上没那么有用。)

另一个解决方案,特别是对于模型,是将其实现为单例,或者具有返回它的单独单例(“模型控制器”)。你不应该使用app delegate;使用为此目的明确制作的单身人士。

您可以在应用程序委托中创建“C”并将其传递给根视图控制器(这是对app委托的正确使用,因为它是全局程序初始化的一部分)。视图控制器可以将对象作为其segue的一部分传递。这是我传递模型对象的首选解决方案。

如果它确实是布局计算委托,这可能是某种配置系统的一部分(假设它可以改变)。可以将当前配置视为模型的一部分,并且所有上述技术仍然有效。

如果它只是共享算法并且没有变化,请不要忘记C函数。没有规则必须将所有代码放入方法中。功能是无状态计算的理想选择。类别可以这种方式使用,但简单的函数具有较少的复杂性。