gpt4 book ai didi

ios - 更抽象的类设计

转载 作者:行者123 更新时间:2023-12-01 16:44:54 27 4
gpt4 key购买 nike

请耐心等待,因为我是新来的,不是母语为英语的人,因此为了确保一切都清楚,这可能有些冗长。

我做了一些研究,找到了一些可能的解决方案,但想知道什么是设计以下 class 的最佳方法。

在我的应用程序中,我有一个“PersonDetailView”屏幕。它包含一个带有该人照片的UImage和一些带有名称,功能,...的标签,以及一个带有“相关”数据的UITableView。该相关数据以SQLite database的形式存储在表中(例如phone_numbers表,online_addresses表等)。

相关数据可以是电话号码(座机,手机),在线地址(电子邮件,URL等),地址,注释,...。
我想在一个分组的TableView中显示相关数据(其中一个用于PhoneNumbers,一个用于Online_Addresses,..),其中各个单元格包含该相关数据:

  • 输入电话号码:说明(例如手机,家庭,工作)+
    数字+按钮
  • 表示在线地址:描述(例如邮件,URL)+地址+
  • 按钮
  • 地址:街道,城市+按钮
  • 注意:简短说明+按钮

  • 然后 :
  • 对于1),我们可以在单元格中有多个按钮:a)通过
    Apple电话应用程序b)通过Skype call ,c)通过SMS
  • 短信
  • 对于2)一个用于加载邮件表或启动Safari的按钮
  • 对于3)启动地图应用程序
  • 对于4)推导航到另一个详细信息视图,其中整个注释以可滚动的UITextView显示

  • 好的描述,现在实现。
    我想在 ViewDidLoad中加载2个具有基本信息的NSArray。
    我检查是否有与此人相关的电话号码,如果是,我将 NSString @“PhoneNumbers”添加到数组中:“sectionTitles”,然后将具有这些phoneNumbers ID的 NSArray添加到数组“relatedData”中(所以relatedData是到目前为止,包含简单易用的包含NSArrays的 NSArray
    请注意,某个人可能没有电话号码,而objectAtIndex 0可以是一个onlineAddress。

    cellForRowAtIndexPath中,我必须创建实际的单元格并获取正确的数据。由于我不确切知道relatedData数组中存在哪种数据,因此索引0或1或2存在问题。

    我想到了多种解决方案,但想要一些建议,其中最好的一种:

    1)我可以在 ViewDidload的某处跟踪存储 objextAtindex 1、2、3 ...的信息,然后通过 cellForRowAtIndexPath中的'switch'语句创建正确的对象。
    它可能有效,但是对我来说这似乎是一个糟糕的解决方案,因为在将来的版本中,例如,如果有第五或第六种相关数据,我将需要在两种方法中都维护代码。我只想在 ViewDidload中注意这一点。

    2)创建一个抽象类“RelatedData”(我发现它们在技术上不存在于Objective C中,但是可以被模拟),我每个相关的数据对象都继承自该类。
    在该类中,我可以定义一个方法,该方法返回带有正确图标和按钮的按钮数组,并在按下时调用该方法,以显示其描述,...
    cellForRowAtIndexPath中,我可以使用抽象类中定义的方法。
    我认为这可能有效,但是随后我将被迫在 ViewDidload中创建我的实际对象(例如PhoneNumber)并存储它们而不是ID。这将消耗更多的内存,但并非不可能,因为永远不会有相关数据的堆。 (但如果我能避免这种情况...)

    3)我觉得代理人可能有更好的解决方案,我的电话号码,在线地址应遵循哪个协议。
    但是由于我的经验不足,这里的事情变得更加模糊。我需要在viewDidLoad中存储一个“classType”(例如,objectAtIndex 0是PhoneNumbers,objectAtIndex 1是注释。
    然后在我的 cellForRowAtIndexPath中,我可以像下面这样创建我的对象:
    [[[ObjectOfClass classType] alloc] init]然后我可以调用我的委托方法(例如,给我按钮)
    这似乎是所有方法中最好的解决方案,但对我来说却很模糊:
  • 我觉得太抽象了吗?
  • 可以在Objective-C上完成吗

  • 实际上:
  • 我如何创建classType的对象(在Objective中以抽象方式(即,无需使用开关)实现)
  • 在哪里为那些代表定义协议

  • 感谢您阅读这个冗长的问题和您的建议

    最佳答案

    您的思考方向正确。
    首先,我建议您结合使用Core Data和NSFetchedResultsController来填充tableView。繁荣,完成。请注意,尽管Core Data具有相当陡峭的学习曲线,但听起来像是您要走的路。

    话虽如此,也许出于您的影响之外的原因,您必须使用sqlite之类的实际数据库。太糟糕了,但可行。您基本上想要做的是实现自己的FetchedResultsController及其委托方法。
    简而言之:您可以在fetchedResultsController中的某个位置请求数据对象。例如,当您与所有人一起显示tableView时,可以完成此操作。例如,在此表视图中点击一行将显示此人的详细数据。因此,您向FRC询问该对象。然后FRC将返回NSDictionary。您可以使用此字典来建立详细的表格视图:字典中每个键一个部分。如果键的值是一个数组,则为单元格的数目,数组中的每个项目都包含该单元格的实际数据。如果键的值不是集合对象,则该部分仅包含一个单元格,并且该对象包含该行的数据。
    当然,您也可以创建自己的数据对象。请注意,此时您开始重新实现核心数据。

    另外,真正要强迫症的一个重要方面是:切勿将视图与数据对象混淆。没有具有属性“MyDataObject”或类似名称的视图。通常,人们会给uitableviewcell一个数据对象的属性,并在设置该属性后会自动更新。这确实是糟糕的设计。我是针对您的观点2讲这个的。不要想太多,保持精简,坚持使用MVC。

    关于ios - 更抽象的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20781245/

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