[英]Pass cell array item to another view controller
因此,这是我一直在阅读的一个常见问题,我仍在学习中,请记住这一点。
基本上,我的应用程序当前允许您向表视图中添加一个项目,然后从表视图中选择一个单元格时,它会显示另一个视图控制器,用于显示该单元格的详细信息。
在我的tableView实现文件.m中,我具有单击单元格时转到视图控制器的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
SelectedItemViewController *selectView = [[SelectedItemViewController alloc] initWithNibName:@"SelectedView" bundle:nil];
[selectView.titleView setText:@"test"];
[self performSegueWithIdentifier:@"showSelected" sender:indexPath];
}
我只是测试了“ setText”代码段,以查看是否能够更改ViewCellController中的textLabel。
当用户保存新项目时,这是以下segue代码,当它返回到TableView时将被调用。 “ toDoItem”是一个NSMutableArray。
-(IBAction)unwindToList:(UIStoryboardSegue *)segue {
AddToDoItemViewController* source = [segue sourceViewController];
ToDoItem* item = source.toDoItem;
if (item != nil){
[self.toDoItems addObject:item];
[self.tableView reloadData];
}
}
显然我做错了。
我想了解的是我如何能够:
选择一个单元格,从数组中的该索引中获取数据,而不只是单元格数据,数据包括:标题,说明,到期日期和完成。
在另一个视图控制器中显示它。
操作完成布尔值并保存,以便再次单击时保持该值。
我不希望有完整的答案,只是要指出正确的方向,以便我自己解决,谢谢!
据我了解,您处于一个简单的Tableview详细情况中。
您有一个项目列表,并且想要在下一个视图中保留特定项目,因此可以显示它的详细信息(或进行编辑或以某种方式进行交互)。
例如,我正在考虑联系人列表或食谱列表。 您有一份饭菜清单,可以看到它们的标题和等级,并且说您想查看成分,您必须轻按一下。
如果我在这里错了,请纠正我,否则,这很简单。
您将需要一个表视图(在UITableViewController
或添加您自己的表视图的简单UIViewController
中)。 无论哪种方式,您的表视图显然已经完成,因此我可以跳过该部分。 该控制器应该在UINavigationController
,该UINavigationController
应该是您唯一的导航控制器。 我会直言不讳地说,如果您是一个初学者(与我一样多),那么您可能会制作一段时间仅具有一个导航控制器的应用程序。
您还可以拥有一个自定义对象数组,您当然可以拥有。 说这是一个Contact
,您有一个Contact
对象数组。
构建表格视图时,将使用该数组联系人并相应地创建单元格。
这是一个非常简短的示例:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"ContactCell";
//I'm assuming you're using a custom cell
ContactCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[ContactCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
Contact *contact = [_dataArray objectAtIndex:indexPath.row];
cell.nameLabel.text = contact.name;
cell.phoneNumberLabel.text = contact.phone;
return cell;
}
这只是一个简短的例子,可以说明我的观点; 请注意,您必须设置数据源和委托以及其他方法( -numberOfRowsInSection:
:)才能使表视图正常工作。
很好,您有一个联系人列表和一个带有他们的电话号码的小文本,但是您想显示他们的地址或阵列中已有但尚未显示的任何内容。 所有这些数据都已经加载,您真的很想显示它。 的确不错的用途是轻按单元格并推另一个视图。 推入效果很好,因为您可以使用操作系统为您创建的后退按钮,这就是为什么需要UINavigationController
的原因
要解决此问题,您将需要两个方法,首先是tableview方法didSelectRowAtIndexPath
,然后是prepareForSegue
。
有很多方法可以解决此问题,但是我将尝试使事情变得简单。 您想知道您轻按了哪个项目,并且想将其提供给下一个视图。 因此,要让它进入下一个视图,您首先需要拥有它。 我们会 :
您可以使用ivar
来保留该引用,有更好/不同的方法,但这很简单。 在我的答案的结尾,其他人可能想用不同的风格做出自己的答案,或者用另一种方式编辑我的答案。
ivar只是.m文件顶部的一个实例变量,您可以访问该.m文件中的任何位置。 有点像@property
但只有该类/控制器可以看到。
您可以在控制器的顶部使用它,该行应该已经位于viewDidLoad
之前,只需添加花括号和变量即可。
@implementation MyTableViewController
{
Contact *_myContactToPass;
}
以下方法将找到项目并调用“通过”方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
_myContactToPass = [_dataArray objectAtIndex:indexPath.row];
[self performSegueWithIdentifier:@"fromTableViewToDetails" sender:self];
}
在DetailsViewController
,您需要在.h文件中作为联系人对象的@property
,以及一些标签和按钮以及所有您需要的爵士乐。 用_contact属性填充所有这些标签,并且由于您总是在加载该视图之前将其传递,因此它们将从所选联系人加载该动态数据,而不从情节提要中加载静态标签。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if([segue.identifier isEqualToString:@"fromTableViewToDetails"]){
DetailsViewController *vc = (DetailsViewController*)segue.destinationViewController;
vc.contact = _myContactToPass;
}
注意事项:
fromTableViewToDetails
创建了一个名为fromTableViewToDetails
的推送fromTableViewToDetails
我很失望,您找不到一个简单的tableview教程来向自己学习,这对任何开发人员来说都是非常重要的一步:搜索,阅读,尝试,重试,学习。 我已经尽可能详细地回答了,并且会回答您的问题,但是简单的Google搜索将带您进入令人印象深刻的网站,您现在会记住:
AppCoda.com
RayWenderlich.com
一旦知道了如何处理非常静态的数据的教程,就可以阅读另一本有关数据库的教程,只需将两者混合即可。 即使我确定有很多教程也将逐步介绍如何将数据加载到数组,显示,编辑/删除其中的某些数据以及永久重新保存它们的完整步骤。
一旦您对所有内容都感到满意,就可以开始阅读有关Core数据(一开始很难处理,但是相当惊人),或者只是FMDB
和SQLite
。 如果有我可以给您的建议,请不要单独使用Sqlite,而要使用FMDB包装器。 sqlite3只是从头开始编写代码的巨大痛苦。
希望这可以帮助。 :)
在您的detailviewcontroller中,然后使用mainviewcontroller中的项目
希望你明白我的意思:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.