- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog((@"This is didSelectRowAtIndexPAth"));
DetailViewController *detailViewController = [[DetailViewController alloc] init];
detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]];
/* The below NSlog is showing the content , its not null still in next viewcontroller same variable showing null content*/
NSLog(@"My Dictionary: This is a MasterView%@",detailViewController.myDictionary);
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
7 回答
try this
Decalre 一个 NSInteger 变量 Globaly 将该变量分配给 indexpath.row
@interface DashbordViewController ()
{
NSInteger SelectedRownum;
}
@end
@implementation DashbordViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SelectedRownum=indexPath.row
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"])
{
NSLog((@"This is didSelectRowAtIndexPAth%@",SelectedRownum));
DetailViewController *detailViewController = [segue destinationViewController];
detailViewController.myDictionary = [self.placeArray objectAtIndex:SelectedRownum];
}
}
这是因为您提供的实例与您DetailViewController
手动创建的实例不同。您应该自己呈现新ViewController
的(模态或通过推送),或者实现该prepareForSegue
方法并在那里设置字典。
编辑:
2个解决方案:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
DetailViewController *detailViewController = [[DetailViewController alloc] init];
detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]];
// If it is a modal
[self presentViewController:detailViewController animated:YES];
}
或者
@implementation MyClass {
NSIndexPath *selectedCellIndexPath;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog((@"This is didSelectRowAtIndexPAth"));
selectedCellIndexPath = indexPath;
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showDetail"]) {
DetailViewController *detailViewController = (DetailViewController *)segue.destinationViewController;
detailViewController.myDictionary = [self.placeArray objectAtIndex:selectedCellIndexPath.row];
}
}
尝试这个 。. .
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog((@"This is didSelectRowAtIndexPAth"));
UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"myStoryBoardName" bundle:nil];
self.detailsViewController = [mystoryboard instantiateViewControllerWithIdentifier:@"detailviewcontroller"]
/* The below NSlog is showing the content , its not null still in next viewcontroller same variable showing null content*/
NSLog(@"My Dictionary: This is a MasterView%@",detailViewController.myDictionary);
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
您必须在 storyBoard 中设置您的 detailViewController 的标识符。
您需要在 prepareForSegue: 方法中分配字典。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { DetailViewController *viewController = = (DetailViewController *)[segue destinationViewController]; detailViewController.myDictionary = //你的字典在这里; }
这样在 DetailViewController 的 viewDidLoad: 中就可以得到相同的字典。
注意:确保分配字典。
希望能帮助到你。
在 DetailViewController 检查 myDictionary 是否是声明为弱或强的属性。
由于我看不到您的控制器的实现(是否是 UIViewController 的子类),我不能说很多,但请记住,这initWithNibName:bundle:
是 UIViewController 的指定初始化程序而不是init
. 所以,这是第一个问题。无论如何,在设置属性之前检查实例。instance 很可能为零。
编辑:
也很有可能,您正在从现有的视图控制器中实例化新的视图控制器。在这种情况下,您可以添加新的视图控制器作为子控制器或从现有的控制器中呈现新的控制器。在这两种情况下,existing 的属性都可以从 new 到 properties:parentViewController
和presentingViewController
,这使故事相反:您将属性值从现有控制器中获取到新控制器中。
您正在创建新的视图控制器didSelectRowAtIndexPath
,最后您正在调用prepareForSegue
方法...这将创建新的实例,因此您必须在这样的方法中设置要在新视图控制器中发送的数据prepareForSegue
。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//
if ([[segue identifier] isEqualToString:@"name_of_ur_segue"])
{
// Get reference to the destination view controller
DetailViewController *detailViewController = [segue destinationViewController];
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
// Pass any data here ...
detailViewController.myDictionary = [self.placeArray objectAtIndex:[indexPath row]];
}
}
编辑:
当您在 ViewDidLoad 方法中访问数据时,在 iOS 7 中,像这样传递的数据在 ViewDidLoad 方法中是不可访问的。由于视图控制器表示逻辑现在有所改变。现在,如果我们想在 initMethod 中访问它,我们可以在 initMethod 中传递数据viewDidLoad
。viewWillAppear
或在或中访问此内容viewDidApepar
。如果您只想在 viewDidAppear 或 ViewWillApepar 中调用此代码一次,只需设置一个布尔标志,它可以告诉您是否要访问此代码。