tru*_*les 7 iphone parameter-passing uitableview uiviewcontroller
好吧,我知道这是一个模糊的概念问题,但我真的需要帮助.如果您决定花时间阅读本文,请提前致谢.我甚至不会考虑写这么多,除非这是一个很有帮助的人这么好的论坛,我认为这将是最好的地方.
这都与这里的问题有关(你不必看它 - 我在下面解释一下):初始化表时传递参数
我已经在同样的问题上工作了几天,但我意识到必须有一些我不知道的大事.我用Google搜索和谷歌搜索,我甚至在几天前买了两本Obj-C书(大约50%),但我仍然抓住看起来应该非常容易的东西.我显然对OOP很新,但我在HTML,perl,sql,python以及一些像pascal和basic这样的古老东西中都有平庸的技巧.我是一个n00b,但不是白痴(嗯,实际上这种体验正在改变我的想法).
无论如何,我的最终目标是在第一个视图(级别1)上创建一个带有8个"普通"按钮的应用程序,每个按钮基本上都做同样的事情 - 这是显示一个简单的表视图(级别2),其中包含数据可以单击以继续深入查看详细信息的单元格(级别3).非常基本和直接的概念.8个可能的2级之间的唯一区别是将显示的数据.我已经构建了sql查询,就像我想要的每个按钮一样.
所以,这就是我的立场:我有一个完美的应用程序,可以完全按照我的预期从第2级完成所有工作 - 查询工作,表格很漂亮 - 所以这很棒.
此外,我有另一个基于导航的应用程序启动"1级",并显示8个按钮(我隐藏1级导航栏).如果我单击级别1上的任何按钮,则级别2视图(导航栏+表格)将完全按照我的要求滑入视图.问题是表格只是空白.无论我做什么,我都无法在第二个应用程序中获得级别2来向我显示数据,即使我可以在第一个应用程序中完美地显示所有数据.对于我的生活,我无法弄清楚如何将第1级与第2级"链接".
希望你能理解我想要弥合的这个差距.由于第2级有8种可能性(在同一个sql表上的sql查询只有很小的差异),我最初尝试用"将"整数"传递"到2级视图(在第一个应用程序中)并且然后根据传递的内容选择sql查询(参见上面关于该惨败的链接).一旦我开始工作,我计划弄清楚如何使按钮稍后"通过".但是,经过大约16个小时的拧紧,我只是放弃了,决定制作8个不同的表视图控制器,除查询外,所有代码都几乎相同.这样一来,如果我只能在1级上获得一个SINGLE按钮,只需按下没有参数的2级中的一个,那么我将是一个可怕但成功的程序员.
不幸的是,即使这样对我来说也没有用.我已经在Interface Builder中尝试了所有可能的控制 - 拖动和窗口/视图/表组合,但无论我尝试什么,数据都不会加载到表视图中,即使它在我的第一个应用程序中运行良好.我已经完成了每一行代码 - 它们是相同的,除了必须"调用"或"启动"2级部分,我只是没有得到它.
所以,我打算在这里打破常规/期望,而不是在我的问题中发布任何代码.我只是想知道 - 这怎么可能这么难?我非常注重分析,而且我很快就会流行起来,但我不得不说我生活中的技术挑战从未如此谦卑.
任何人都可以在概念层面向我解释我需要在这里做什么或者我缺少什么?即使你给我一些阅读内容的链接,我也会非常感激.我在youtube上看了几十个小时的教程,但我总是想要更多.
当然我愿意分享我的代码,但是它有很多,而且我很新,我真的不知道相关部分在哪里.另外,我实际上想了解所有这些是如何工作的,所以我可以帮助别人.如果在这里有PM这样的东西,如果你愿意看看,我会给你发电子邮件.一旦我开始工作,我将在这里发布代码.我不得不相信还有其他人在寻找和我一样的东西.但是,更重要的是,我只是想从高层次上了解解决问题的正确方法是什么?如果你查看我的链接,你可以看到我一直在尝试(这是将一个整数传递给填充表的方法),但正如我所说,我基本上放弃了,因为我没有得到任何地方.人们试图帮助我,但我是个白痴.
感谢你带着我痛苦的长信息.如果你做到这一点,并为我提出一些建议,我会全力以赴.不过我会说实话 - 如果你告诉我我应该废弃整件事并使用核心数据我会哭.我真的不认为我有时间找出一种完全不同的数据管理方式.正如我所说,我对数据库和我的应用程序的查询部分非常满意 - 它只是管理怪异的视图并在它们之间传递数据,这让我感到害怕!
感谢任何帮助 - 非常感谢你们.
如果我正确理解你的问题,你是在问如何初始化视图控制器并传入一些数据来改变其行为。这里要理解的关键概念是 Objective-C 中对象是如何初始化的。iOS 新手最常见的问题之一是:
是的,有八个不同的链接。(好吧,第八个链接有点偏离主题,但它已经足够接近了。)有几种方法可以做到这一点,我将简要介绍它们。我还将描述自定义初始值设定项,这也是一个相关点。
假设我们正在构建一个目录应用程序,它显示不同类别的一堆产品。想象一下,我们的应用程序打开一个产品列表,就像 Apple Store 应用程序一样。假设当用户点击产品时我们想要显示产品页面。
您可以在“下一个”视图控制器上设置属性。- 简单地说,我们可以创建一个UIViewController子类并设置productID属性(我们编写的)。我们将新的称为UIViewControllera 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
}
Run Code Online (Sandbox Code Playgroud)
在第一行中,我们创建产品视图控制器。alloc那么我们就打电话吧init。(函数被包装 - 也就是说,我们init 直接调用方法的结果alloc。)
然后,我们设置视图的属性。现在可以配置视图viewWillAppear,一切都很好。
您可以通过持久存储共享数据。- 这种方法的工作原理略有不同。除了第一个视图控制器呈现第二个视图控制器之外,视图控制器根本不进行通信。每当第一个视图中的值发生更改(您希望保留该值)时,您可以将其写入 Core Data 或NSUserDefaults. 然后,新视图根据需要读取该值。
在你的第一个视图控制器中:
//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
}
Run Code Online (Sandbox Code Playgroud)您可以使用自定义初始值设定项。- 一旦您理解了这个概念,这可能是最直观的方法,因为这是唯一真正“传递”数据的方法。(与方法 2 不同,方法 2 不直接共享数据,而方法 1 则将数据作为属性传递。)
请注意,在前面的示例中,我使用了该initWithNibName:Bundle方法。您可能还注意到UITableViewControllers 使用不同的初始值设定项initWithStyle:。这两个初始化程序获取新对象的一些信息,以便它知道如何加载。我们先看第一个:
- (id)initWithNibName:(NSString *)nibNameOrNil Bundle:(NSBundle *)bundleNameOrNil;
Run Code Online (Sandbox Code Playgroud)
第一个参数告诉视图控制器要加载哪个 nib 文件。我现在将忽略第二个参数,因为除了 之外我从未见过任何传入的内容nil。继续看第二个例子:
- (id)initWithStyle:(UITableViewStyle)style;
Run Code Online (Sandbox Code Playgroud)
您可以在此处传入两个UITableViewStyle值之一。这是定义表视图样式的一种方法(另一种方法是直接修改 nib 文件)。
让我们将这个概念稍微扩展到我们的示例中。我现在将向您展示如何制作您自己的自定义初始值设定项。让我们初始化 ProductPageViewController 实例:
- (id) initWithProductID:(int)productID;
Run Code Online (Sandbox Code Playgroud)
这很简单。现在,我们需要实现该方法并实际对产品 ID 执行一些操作。我们将从这里的准系统代码开始,需要“模仿”默认初始化程序的功能。
- (id) initWithProductID:(int)productID{
self = [super init];
return self;
}
Run Code Online (Sandbox Code Playgroud)
此方法将返回我们的初始化副本ProductPageViewController,但是,它还不会从 NIB 加载我们的 UI,或者如果这是一个UITableViewController,它不会设置UITableViewStyle. 让我们首先使用 NIB,然后我将展示如何使用UITableViewController. 所以...
- (id) initWithProductID:(int)productID{
self = [super initWithNibName:@"ProductPageViewController" Bundle:nil];
return self;
}
Run Code Online (Sandbox Code Playgroud)
现在。我们有一个ProductPageViewController从 NIB 加载的已初始化的 ,但它还没有执行任何操作。请注意,我们如何不公开NibName和Bundle参数,而只是将它们传递给我们自己。如果你愿意,理论上你也可以暴露这些。现在,让我们用productID它做点什么。
- (id) initWithProductID:(int)productID{
self = [super initWithNibName:@"ProductPageViewController" Bundle:nil];
if(self){
self.prodID = productID;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
通过我们最新的更改,我们的“ PPVC”现在了解了productID. 它可以根据需要查询数据库并对结果进行处理。然后您可以基于此运行不同的查询productID。
另外两个快速提示:
也许您想传递几个参数。当然,您可以简单地将它们添加到方法签名中- (id) initWithProductID:(int)productID andCategoryID(int)categoryID,但是如果您有五个、六个或五十六个(是的,很多)参数,会发生什么情况?我建议传递参数的集合或数组。
要将自定义初始值设定项与 一起使用UITableView,请传入 aUITableViewStyle而不是 NIB 名称。它可能如下所示:
- (id) initWithProductID:(int)productID{
self = [super initWithStyle:UITableViewStyleGrouped];
if(self){
self.prodID = productID;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)在制作小节时,我建议结合使用持久数据和自定义初始值设定项。我还建议看一下viewDidLoad和viewWillAppear方法。
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |