繁体   English   中英

将单元格数组项传递给另一个视图控制器

[英]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];
    }
}

显然我做错了。

我想了解的是我如何能够:

  1. 选择一个单元格,从数组中的该索引中获取数据,而不只是单元格数据,数据包括:标题,说明,到期日期和完成。

  2. 在另一个视图控制器中显示它。

  3. 操作完成布尔值并保存,以便再次单击时保持该值。

我不希望有完整的答案,只是要指出正确的方向,以便我自己解决,谢谢!

据我了解,您处于一个简单的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数据(一开始很难处理,但是相当惊人),或者只是FMDBSQLite 如果有我可以给您的建议,请不要单独使用Sqlite,而要使用FMDB包装器。 sqlite3只是从头开始编写代码的巨大痛苦。

希望这可以帮助。 :)

  1. 在您的detailviewcontroller中,您可以将toDoItem设置为弱属性...
  2. 实例化detailviewcontroller后,在mainviewcontroller的didselectrow中,可以将其todoitem设置为mainviewcontroller中给定索引路径下的todoitem。

在您的detailviewcontroller中,然后使用mainviewcontroller中的项目

  1. 在轻松进行搜索时,您唯一需要做的就是重新加载tableviews数据。

希望你明白我的意思:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM