gpt4 book ai didi

iphone - 我如何 "connect"到 View Controller 的 TableView

转载 作者:行者123 更新时间:2023-12-03 18:39:50 26 4
gpt4 key购买 nike

好吧,我知道这是一个模糊的概念性问题,但我真的需要帮助。如果您决定花时间阅读本文,请提前致谢。我什至不会考虑写这么多,除非这是一个非常棒的论坛,有这么多乐于助人的人,我认为这是最好的提问地点。

这都与这里的问题有关(您不必看它-我在下面解释了所有内容):Pass parameter when initializing table

我已经在同一个问题上工作了好几天,但我意识到一定有一些重要的东西我遗漏了。我在谷歌上搜索和搜索,几天前我什至买了(大约 50% 的人阅读了)两本 Obj-C 书籍,但我仍在掌握一些看起来应该非常容易的东西。我显然是 OOP 的新手,但我在 HTML、perl、sql、python 以及一些古老的东西(如 pascal 和 basic)方面的技能一般。我是 n00b,但不是白痴(嗯,实际上这次经历正在改变我的想法)。

无论如何,我的最终目标是在第一个 View (级别 1)上简单地创建一个带有 8 个“普通”按钮的应用程序,每个按钮基本上都做同样的事情 - 即显示一个简单的表格 View (级别 2),其中包含数据可以单击以继续深入查看详细信息的单元格(级别 3)。非常基本和直接的概念。 8 个可能的 2 级之间的唯一区别是将显示的数据。我已经为每个按钮构建了按我想要的方式工作的 sql 查询。

所以,这就是我的立场:我有一个完美运行的应用程序,它可以完全按照我的预期执行从 2 级到以下的所有操作 - 查询有效,表格很漂亮 - 这太棒了。

此外,我还有另一个基于导航的应用程序,它在“级别 1”上启动并显示 8 个按钮(我隐藏了级别 1 的导航栏)。如果我单击级别 1 上的任何按钮,级别 2 View (即导航栏 + 表格)将完全按照我的意愿滑入 View 。问题是表格是空白的。无论我做什么,我都无法在第二个应用程序中获得级别 2 来显示数据,即使我可以在第一个应用程序中完美显示所有数据。对于我的生活,我无法弄清楚如何将级别 1 与级别 2“联系起来”。

希望你能理解我试图弥合的这个差距。由于级别 2 有 8 种可能性(在同一个 sql 表上的 sql 查询只有很小的差异),我最初尝试提出一种将整数“传递”到级别 2 View 的方法(在第一个应用程序中)和然后根据传递的内容选择 sql 查询(有关该惨败,请参阅上面的链接)。一旦我开始工作,我计划在以后弄清楚如何让按钮进行“传递”。然而,在搞砸了大约 16 个小时之后,我放弃了并决定制作 8 个不同的表 View Controller ,除了查询之外,所有的代码几乎相同。那样的话,如果我能在第 1 级上获得一个单一按钮,只需按到第 2 级中的一个而没有参数,我将成为一个可怕但成功的程序员。

不幸的是,即使这对我来说也没有奏效。我已经尝试了在 Interface Builder 中我能想到的所有可能的控制拖动和窗口/ View /表格组合,但无论我尝试什么,数据都永远不会加载到表格 View 中,即使它在我的第一个应用程序中运行良好。我已经完成了每一行代码 - 它们是相同的,除了必须“调用”或“启动”第 2 级部分,而我就是不明白。

所以,我将打破这里的惯例/期望,而不是在我的问题中发布任何代码。我只想知道——这怎么可能这么难??我非常善于分析,而且很快就跟上了,但我不得不说,我一生中从未因技术挑战而如此谦卑。

谁能在概念层面向我解释我需要在这里做什么或我缺少什么?即使你给我一个可以阅读的链接,我也会非常感激。我已经在 youtube 上观看了数十个小时的教程,但我总是期待更多。

当然,我愿意分享我的代码,但是代码太多了,而且我对此很陌生,我真的不知道相关部分在哪里。另外,我实际上想了解所有这些是如何运作的,以便我可以帮助他人。如果这里有像 PM 这样的东西,如果你愿意看一看,我会通过电子邮件发送给你。一旦我得到它的工作,我会在这里发布代码。我必须相信还有其他人在寻找和我一样的东西。然而,更重要的是,我只想从高层次上知道,解决我的问题的正确方法是什么?如果您查看我的链接,您可以看到我一直在尝试的内容(即向填充表的方法传递一个整数),但正如我所说,我基本上放弃了,因为我什么也没有得到。人们试图帮助我,但我是个白痴。

感谢您忍受我那令人痛苦的长信息。如果你做到了这一点并且对我有一些建议,我会全神贯注。不过,老实说 - 如果你告诉我我应该放弃整个事情并使用核心数据,我会哭的。我真的不认为我有时间找出一种完全不同的数据管理方式。正如我所说,我对我的应用程序的数据库和查询部分感到非常满意 - 它只是管理令人毛骨悚然的 View 并在它们之间传递数据,这让我很伤心!

任何帮助表示赞赏 - 非常感谢大家。

最佳答案

如果我正确理解您的问题,您是在询问如何初始化 View Controller 并传入一些数据以改变其行为。这里要理解的关键概念是对象在 Objective-C 中是如何初始化的。刚接触 iOS 的开发人员最常见的问题之一是:

How can I pass data between my views?



是的,那里有八个不同的链接。 (好吧,第八个链接有点偏离主题,但已经足够接近了。)有几种方法可以做到这一点,我将简要介绍它们。我还将描述自定义初始值设定项,这也是一个相关的点。

让我们假设我们正在构建一个目录应用程序,它显示了各种类别的一堆产品。想象一下,我们的应用程序打开一个产品列表,很像 Apple Store 应用程序。假设当用户点击产品时,我们想要显示产品页面。
  • 您可以在“下一个” View Controller 上设置属性。 - 简单地说,我们可以创建一个 UIViewController子类并设置 productID属性(property)(我们编造的)。让我们调用我们的新 UIViewController ProductPageViewController .这是这样的:
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

    //Create a ProductPageViewController
    ProductPageViewController *ppvc = [[ProductPageViewController alloc] initWithNibName:@"ProductPageViewController" bundle:nil];
    //set the property on our ProductPageViewController
    [ppvc setProductID:42];
    //We would usually present the PPVC here.
    //After presenting, remember to release the view controller
    }

    在第一行中,我们创建了产品 View Controller 。我们调用 alloc ,然后 init . (函数被包装起来——也就是说,我们直接在 init 方法的结果上调用 alloc。)

    然后,我们设置 View 的属性。现在可以在 viewWillAppear 中配置 View 一切都很好。
  • 您可以通过持久存储共享数据。 - 这种方法的工作方式略有不同。 View Controller 根本不通信,除了第一个呈现第二个。每当第一个 View 中的值发生变化(您想要持久化)时,您将其写入 Core Data 或 NSUserDefaults .然后,新 View 会根据需要读取该值。

    在您的第一个 View Controller 中:
    //A method to store the data
    - (void)storeData:(id)pageID{
    [[NSUserDefaults setObject:pageID forKey:@"pageID"];
    }

    - (void)showNewPPVC{

    ProductPageViewController *ppvc = [[ProductPageViewController alloc] initWithNibName:@"ProductPageViewController" bundle:nil];
    //Show and then release the PPVC
    }
  • 您可以使用自定义初始值设定项。 - 一旦你理解了这个概念,这可能是最直观的方法,因为这是唯一一个真正“传递”数据的方法。 (与不直接共享数据的方法 2 和将数据作为属性传递的方法 1 不同。)

    请注意,在前面的示例中,我使用了 initWithNibName:Bundle方法。您可能还会注意到 UITableViewController s 使用不同的初始化程序,initWithStyle: .这两个初始化器接收新对象的一些信息,以便它知道如何加载。我们先来看第一个:
    - (id)initWithNibName:(NSString *)nibNameOrNil Bundle:(NSBundle *)bundleNameOrNil;

    第一个参数告诉 View Controller 加载哪个 nib 文件。我现在将忽略第二个参数,因为除了 nil 之外,我从未见过任何传入的参数。 .继续看第二个例子:
    - (id)initWithStyle:(UITableViewStyle)style;

    您可以传入两个 UITableViewStyle 之一这里的值(value)观。这是定义表格 View 样式的一种方式(另一种方式是直接修改 nib 文件)。

    让我们将这个概念扩展到我们的例子中。我现在将向您展示如何制作自己的自定义初始值设定项。让我们初始化我们的 ProductPageViewController 实例:
    - (id) initWithProductID:(int)productID;

    这很简单。现在,我们需要实现该方法并对产品 ID 进行实际操作。我们将从这里的准系统代码开始,需要“模仿”默认初始值设定项的功能。
    - (id) initWithProductID:(int)productID{
    self = [super init];

    return self;
    }

    此方法将返回我们 ProductPageViewController 的初始化副本。 ,但是,它不会从 NIB 加载我们的 UI,或者如果这是一个 UITableViewController ,它不会设置 UITableViewStyle .让我们先使用 NIB,然后我将展示如何使用 UITableViewController .所以...
    - (id) initWithProductID:(int)productID{
    self = [super initWithNibName:@"ProductPageViewController" Bundle:nil];

    return self;
    }

    现在。我们有一个初始化 ProductPageViewController ,从 NIB 加载,但它还没有做任何事情。注意我们如何不暴露 NibNameBundle参数,但我们只是将它们传递给自己。如果你愿意,理论上你也可以公开这些。现在,让我们来看看 productID并用它做点什么。
    - (id) initWithProductID:(int)productID{
    self = [super initWithNibName:@"ProductPageViewController" Bundle:nil];

    if(self){
    self.prodID = productID;
    }

    return self;
    }

    随着我们的最新变化,我们的“PPVC”现在知道 productID .它可以根据需要查询数据库并对结果进行处理。然后,您可以基于此 productID 运行不同的查询.

  • 另外两个快速提示:
  • 也许您想传入几个参数。当然,您可以简单地将它们添加到它们方法签名 - (id) initWithProductID:(int)productID andCategoryID(int)categoryID ,但是如果您有五个、六个或五十六个(是的,很多)参数会发生什么?我建议传入参数集合或数组。
  • 通过 UITableView 使用自定义初始值设定项, 你传入一个 UITableViewStyle而不是 NIB 名称。它可能如下所示:
          - (id) initWithProductID:(int)productID{
    self = [super initWithStyle:UITableViewStyleGrouped];

    if(self){
    self.prodID = productID;
    }

    return self;
    }

  • 在制作小节时,我建议结合使用持久数据和自定义初始值设定项。我还建议您查看 viewDidLoadviewWillAppear方法。

    关于iphone - 我如何 "connect"到 View Controller 的 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6257025/

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