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

Ios 概念:两个控制器使用相同的计算方法-委托?,ios,objective-c,delegates,protocols,Ios,Objective C,Delegates,Protocols,我有两个甚至更多的视图控制器(A和B),它们使用相同的计算方法。我想最好的方法是将计算方法放在它自己的类中(我们称之为C),定义一个协议,就是这样。如果这是正确的,我如何知道如何称呼代表 如果我alloc/init类C的对象(使用calculatormethod的对象),例如在类B中,我的对象指针在类B中-这没关系。但是,我如何在类A甚至其他类中获得已知的对象指针(即,如何告诉那些希望使用委托的控制器(即相同的计算方法),如何在委托被类B alloc/init分配后寻址委托 非常感谢您的帮助!为

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

如果我alloc/init类C的对象(使用calculatormethod的对象),例如在类B中,我的对象指针在类B中-这没关系。但是,我如何在类A甚至其他类中获得已知的对象指针(即,如何告诉那些希望使用委托的控制器(即相同的计算方法),如何在委托被类B alloc/init分配后寻址委托


非常感谢您的帮助!

为包含计算方法的a和B(以及任何数量的附加控制器)使用超类。通过使用超类,您不必允许初始化其他类或使用委托,所有子类都可以访问该方法

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

编辑后:


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

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

我将研究哪个类F可以负责实例化A和B。 这个类(可以被描述为工厂)的职责还可以是为a和B的实例提供一个C实例

所以我要做的是:定义一个“工厂”类,该类具有构建a和B实例的方法。 这些方法中的每一个都会提供一个C实例。如果您希望共享,此C实例可以是factory类的属性(或者此factory类也可以从可用的C实例池中选取C实例)

更新:如果您使用故事板来实例化控制器,则不实用。在这种情况下,您可能希望使用其他给定答案,或者将共享计算函数实现为单例类C的方法(参见示例)

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

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

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

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

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

另一个解决方案,特别是对于模型,是将其实现为一个单例,或者使用一个单独的单例(一个“模型控制器”)来返回它。您不应该为此使用app委托;使用专门为此目的制作的单例

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

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

如果它真的只是共享算法,并且没有变化,不要忘记C函数