Iphone 在表视图中选择数据后,如何将数据传递到详图视图?

Iphone 在表视图中选择数据后,如何将数据传递到详图视图?,iphone,objective-c,ios,xcode,uitableview,Iphone,Objective C,Ios,Xcode,Uitableview,我有一个UITableViewController,其中包含从名为userList的NSMutableArray填充的数据。选择特定用户后,它将转到详细视图,并更新导航栏中的标题,但不会传递数据以更新UIView中的UILabel - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:index

我有一个UITableViewController,其中包含从名为userList的NSMutableArray填充的数据。选择特定用户后,它将转到详细视图,并更新导航栏中的标题,但不会传递数据以更新UIView中的UILabel

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[tableView deselectRowAtIndexPath:indexPath animated:NO];

//Attempt at a singleton to pass the data
DetailView *details = [[DetailView alloc] init];
details.userNameLbl = [userList objectAtIndex:indexPath.row];


DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil];

//This line doesn't pass the data
detailVC.userNameLbl.text = [userList objectAtIndex:indexPath.row];

//This line does update the title in the NavBar
detailVC.navigationItem.title = [userList objectAtIndex:indexPath.row];

[self.navigationController pushViewController:detailVC animated:YES];

[details release];
[detailVC release];

}
我应该尝试将数据从表视图推送到详细视图,还是让详细视图尝试从表视图中提取数据

h有下面一行,它实际上连接在IB中

IBOutlet UILabel *userNameLbl

大概您的
DetailView
需要来自所选行的数据才能正常工作

如果是这样,我认为“正确”的方法是创建一个自定义的
init
方法,该方法传递您所需的数据。例如:

[[DetailView alloc] initWithTitle:(NSString *)title text:(NSString *)text]

您的方法本身没有什么问题,但是在创建视图控制器时传递视图控制器所需的数据在架构上更好(在我看来,我相信有人会不同意!)。例如,设想一个表视图控制器-您在
init
方法中传递表视图样式,以后不进行设置。对于
UIImageView
,也一样-您有一个
initWithImage
方法,可以在创建时设置图像。

从nib文件加载视图之前,
userNamelbl
不会实例化。这不会在初始化时立即发生,但会在调用
viewDidLoad
时发生

因此,您应该在DetailView中声明一个属性来存储标题,然后在
viewDidLoad
方法中将该值分配给
userNamelbl.text

例如,在表viewController中:

DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil];
detailVC.userName = [userList objectAtIndex: indexPath.row];
- (void) viewDidLoad
{
   [super viewDidLoad];
   self.userNameLbl.text = self.userName;
}
在详细信息viewController中:

DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil];
detailVC.userName = [userList objectAtIndex: indexPath.row];
- (void) viewDidLoad
{
   [super viewDidLoad];
   self.userNameLbl.text = self.userName;
}
viewController的navigationItem属性是在初始化viewController时创建的,因此您可以立即分配给
navigationItem.title


Swift代码


您是否混合了
UIViews
UIViewControllers
?您应该有一个继承自
UIViewController
DetailViewController
类或一些子类(如
UITableViewController
);它将有
DetailViewController.m
DetailViewController.h
文件来声明和定义类。它应该有一个相应的nib,用于定义
UIViewController
加载的
UIView
;它将有一个
DetailView.xib
文件

无法直接将值分配给
UILabel
,因为在需要分配用户名值时,
UIView
尚未加载

为了执行所需操作,您应该声明一个公共属性(
userName
),以将值从主控制器“推送”到详图视图控制器上。加载详图视图后,可以将特性中的值指定给标签和导航栏

在主视图控制器(
UITableViewController
)中:

在详细视图控制器中:

DetailView *detailVC = [[DetailView alloc] initWithNibName:nil bundle:nil];
detailVC.userName = [userList objectAtIndex: indexPath.row];
- (void) viewDidLoad
{
   [super viewDidLoad];
   self.userNameLbl.text = self.userName;
}
DetailViewController.h

@property (retain) NSString* userName;
@property (nonatomic, retain) IBOutlet UILabel *userNameLbl;
DetailViewController.m

@synthesize userName;
@synthesize userNameLbl;

-(void) viewDidLoad {
    [super viewDidLoad];
    self.userNameLbl.text = self.userName;
    self.navigationItem.title = self.userName;
}

此外,您可以考虑使用<代码>用户类,并将其实例传递给视图。然后视图可以初始化用户特定的任何部分。它甚至可能有助于将此
User
类设置为核心数据实体类型。这样做会导致类型上出现NSString和UILabel不匹配的警告-是否有方法实现您的解决方案并避免这种情况?我假设userList是一个NSString数组。如果userName属性也是一个NSString,那么您不应该得到一个不匹配的字符串。从概念上来说,我绝对同意您的方法,但是我需要更多的帮助(我是noob)来实现。我的理解是,上面的一行将进入TableView中的didSelectRowAtIndexPath:方法的内部,然后(这是我得到模糊信息的地方)initWithTitle:text:方法的实际实现将在DetailView中。对吗?这个方法是+1。我之所以推荐这种方法,是因为它简单而优雅。@lxt我很想看到更多关于这种解决方案的信息,但我不得不感谢AshleyMills,因为这是我在应用程序中使用的解决方案。谢谢大家!