【问题标题】:Passing Data between View Controllers : from uitableview to a details view controller在视图控制器之间传递数据:从 uitableview 到细节视图控制器
【发布时间】:2012-07-17 03:59:34
【问题描述】:

我正在使用 IOS 5 和 Storyboard 编码。我已经构建了一个应用程序,其中我有一个 tableView 连接到一个带有搜索栏的 sqlite 数据库。 当我们触摸一行时,它会自动将我们带到另一个名为“Details”的视图控制器。 我需要将数据从我的表格视图传递到详细信息视图控制器,例如将 author.title 传递给 labelText.text 字段。 有什么想法吗?

已编辑问题:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//    NSString *Title;
    Details *dv = (Details*)segue.destinationViewController;
    author.title = dv.labelText.text;
}

部分代码:

//
//  Details.m
//  AuthorsApp
//
//  Created by georges ouyoun on 7/17/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "Details.h"
#import "Author.h"


@interface Details ()

@end

@implementation Details

@synthesize labelText;
@synthesize selectedAuthors;
@synthesize author;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
   self.labelText.text = self.author.title;
    // Do any additional setup after loading the view.
    NSLog(@"Everything is ok now !");
}

- (void)viewDidUnload
{
  //  [self setLabelText:nil];
    NSLog(@"U have entered view did unload");
    [super viewDidUnload];

    [self setLabelText:Nil];
    // Release any retained subviews of the main view.
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//    NSString *Title;
    Details *dv = (Details*)segue.destinationViewController;
  //  author.title = dv.labelText.text;
    dv.labelText.text = author.title;
}




/*
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([segue.identifier isEqualToString:@"AuthorsCell"]) {

        [segue.destinationViewController setLabelText:author.title];

    }


}




/*
-(void)viewWillAppear:(BOOL)animated
{ 

    self.labelText.text = author.title;

    NSLog(@"U have entered the viewWillAppear tag");
  //  detailsLabel.text = food.description;
}
*/

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)dealloc {
    [labelText release];
    [super dealloc];
}
@end

【问题讨论】:

    标签: ios xcode uitableview uistoryboard


    【解决方案1】:

    出于演示目的,我假设我们有两个视图控制器ListViewControllerDetailViewController。 ListViewController 有 tableview 并且你已经创建了一个segue between your tableview cell and details view controller

    我假设您将其命名为“DetailSegue”。您的故事板应该类似于下图。

    选择 tableViewCell 和 DetailViewController 之间的 segue,打开属性检查器并将标识符指定为 'DetailSegue'。见下图,

    现在运行应用程序,您应该会看到从 ListViewController 到 DetailViewController 的流畅导航。

    Assuming you datasource is an array of stings and you have your datasource and delegate setup already properly for your list tableView.

    在你的 List 视图控制器中添加一个方法 prepareForSegue:sender,这个方法会在 segue 即将执行时被调用。这个方法会被自动调用。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
       if ([segue.identifier isEqualToString:@"DetailSegue"]) {
        DetailViewController *detailVC = (DetailViewController*)segue.destinationViewController;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)sender];
        detailVC.title = [self.source objectAtIndex:indexPath.row];
      }
    }
    

    在 DetailViewController 中添加一个名为 title 的属性来存储选定的标题,并为 UILabel 添加另一个出口以在视图中显示标题。

    DetailViewController.h

    #import <Foundation/Foundation.h>
    
    @interface RecipeListViewController : NSObject
    
    @property (weak, nonatomic) NSString *title;
    @property (weak, nonatomic) IBOutlet UILabel *titleLabel;
    
    @end
    

    DetailViewController.m

    @implementation RecipeListViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.titleLabel.text = self.title;
    }
    @end
    

    别忘了连接插座。我希望这能让您大致了解我们如何在视图控制器之间传递数据。

    【讨论】:

    • 感谢您抽出宝贵的时间来回答..虽然自从我发布这个问题以来我已经改变了整个层次结构,但是您的演示可以帮助将来的人...谢谢您和您的100% 正确
    【解决方案2】:

    是的,你需要使用

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    方法(覆盖)女巫允许您通过获取 segue.destinationViewController 来传递详细信息,然后设置目标控制器的属性。

    例如

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    detailViewController *dv = (detailViewController*)segue.destinationViewController;
    dv.attribute1 = dataFromTable;
    }
    

    例如,如果您将表格数据放在数组中,一个简单的方法是获取推送的行的行号并将其设置为变量

    int rowPressed;
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    rowPressed = indexPath.row;
    
    }
    

    然后在PrepareForSegue 中将数据传递给DetailViewController。使用 rowPressed 从您的数据模型中获取相关数据。

    希望这会有所帮助!

    【讨论】:

    • 能否请您提供一个代码 sn-p 来解释这件事?提前谢谢你
    • 我做错了吗? : - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ labelText.text = author.title; }
    • @EliasRahme 我在我的答案检查中添加了更多细节,如果你仍然卡住,请告诉我。
    • 我很迷茫,我真的是 Xcode 的新手,您能否检查我编辑的问题以确保我是否走在正确的轨道上?谢谢楼主
    • 你在正确的轨道上。但我认为您想要的是dv.testLabel.text = author.title 您设置目标视图控制器属性。如果你反其道而行之,你会得到 nil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多