【问题标题】:How to Pass Data Object to View Controller Embedded in Navigation Controller in Different Storyboard如何将数据对象传递给嵌入在不同故事板中的导航控制器中的视图控制器
【发布时间】:2020-07-12 05:27:19
【问题描述】:

当视图控制器位于不同的情节提要中时,我的代码通常可以正常工作以将对象传递给另一个视图控制器。

我的代码加载了嵌入在导航控制器中的正确视图控制器,但没有任何数据。 (目标 VC 中的数据对象为 nil)。

这是我正在尝试使用的代码;

UIStoryboard *sb2 = [UIStoryboard storyboardWithName:@"secondSB" bundle:nil];
UINavigationController* nav = [sb2 instantiateViewControllerWithIdentifier:@"userNav"];
userDetail *destVC = (userDetail * )nav.topViewController;
NSLog(@"user name%@",user.name);//Logs name showing the user is not empty
destVC.user = user;
[self presentViewController:nav animated:YES completion:nil];

上面加载了一个没有数据的VC。

如果我在没有导航控制器的情况下直接呈现 VC,我可以将数据对象传递给 VC。但在这种情况下,我失去了我需要的导航功能。

UIStoryboard *sb2 = [UIStoryboard storyboardWithName:@"secondSB" bundle:nil];
userDetail *destVC = [sb2 instantiateViewControllerWithIdentifier:@"userDetail"];
NSLog(@"user name%@",user.name);//Logs name showing the user is not empty
destVC.user = user;
[self presentViewController:destVC animated:YES completion:nil];

上面的代码可能有什么问题,我应该使用什么代码。

编辑:

我能够将诸如字符串之类的常规对象传递给嵌入在导航中的 VC。或者,当它没有嵌入导航时,我可以将自定义对象传递给 VC。当嵌入到导航中时,我只是无法传递自定义对象,例如用户,或者我创建了另一个用于测试的 NSObject 到 VC。当使用不同的故事板时,这可能是一些奇怪的故障。

编辑 2

这是我创建的轻量版用户的对象代码,以防原始用户对象出现问题:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface lightUser : NSObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * userid;
@property (nonatomic, retain) NSString * descript;

@end

它是VC中的一个属性:

#import "lightServer.h"
//in interface
@property (weak, nonatomic) lightUser* user;

ViewDidLoad 中的以下代码没有任何作用,用户显示为 nil:

self.user.name = @"Hello there";//

po self.user.name 在调试器中显示 nil po self.user 在调试器中显示为零

【问题讨论】:

  • 在这一行:NSLog(@"user name%@",user.name); ...destVC 的值是多少?它是对userDetail 类的导航控制器的“根”视图控制器的有效引用吗? (旁注:类名应以大写开头)
  • 我刚刚做了一个快速测试,对我来说效果很好。您是否正在对 userDetail 控制器中的 user 对象执行其他操作?
  • 您的第一条评论:当我设置断点并执行 po 时,nav 和 destVC 都以视觉方式显示 destVC 应该出现的方式(没有数据值)。 nav 不会显示为与 destVC 不同,而是显示为与 destVC 相同。我无法解码参考。 P for nav Gives (UINavigationController *) $20 = 0x0000000111008800 p for destVC give (userDetail *) $21 = 0x0000000110a43a40
  • 第二条评论:除了在 viewdidload 中显示 user.name,我没有做任何不寻常的事情。用户对象本身中有一些方法可以将名字和姓氏等组合成一个名字。就是这样。
  • 您说得对,用户(自定义)对象出了点问题。我尝试发送一个字符串并且成功了。

标签: ios uinavigationcontroller storyboard


【解决方案1】:

如果没有看到您的代码的完整示例,不确定,但我一定是遗漏了一些东西......

这是一个完整的例子。与 @IBOutlet@IBAction(以及 Storyboard ID)相关联的内容应该很明显:

UserObject.h

//
//  UserObject.h
//  Created by Don Mag on 4/1/20.
//

#import <Foundation/Foundation.h>

@interface UserObject : NSObject

@property (strong, nonatomic) NSString *firstName;
@property (strong, nonatomic) NSString *lastName;
@property (assign, readwrite) NSInteger age;

- (NSString *)name;

@end

UserObject.m

//
//  UserObject.m
//  Created by Don Mag on 4/1/20.
//

#import "UserObject.h"

@implementation UserObject

- (NSString *)name {
    return [NSString stringWithFormat:@"%@, %@", _lastName, _firstName];
}

@end

** FirstViewController.h**

//
//  FirstViewController.h
//  Created by Don Mag on 4/1/20.
//

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController
@end

** FirstViewController.m**

//
//  FirstViewController.m
//  Created by Don Mag on 4/1/20.
//

#import "FirstViewController.h"
#import "UserDetailViewController.h"
#import "UserObject.h"

@interface FirstViewController ()

@property (strong, nonatomic) UserObject *aUserObject;
@property (assign, readwrite) NSInteger iAge;

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // initialize age
    _iAge = 25;

    // initialize a new UserObject
    _aUserObject = [UserObject new];

    _aUserObject.firstName = @"John";
    _aUserObject.lastName = @"Smith";
    _aUserObject.age = _iAge;

}

- (IBAction)didTap:(id)sender {

    UIStoryboard *sb2 = [UIStoryboard storyboardWithName:@"secondSB" bundle:nil];
    UINavigationController* nav = [sb2 instantiateViewControllerWithIdentifier:@"userNav"];

    UserDetailViewController *destVC = (UserDetailViewController * )nav.topViewController;

    // increment age, so it changes each time we call this method
    _iAge++;

    _aUserObject.age = _iAge;

    destVC.userObj = _aUserObject;

    [self presentViewController:nav animated:YES completion:nil];

}

@end

UserDetailViewController.h(VC 在第二个故事板中)

//
//  UserDetailViewController.h
//  Created by Don Mag on 3/31/20.
//

#import <UIKit/UIKit.h>

#import "UserObject.h"

@interface UserDetailViewController : UIViewController

@property (strong, nonatomic) UserObject *userObj;

@end

UserDetailViewController.m

//
//  UserDetailViewController.m
//  Created by Don Mag on 3/31/20.
//

#import "UserDetailViewController.h"

@interface UserDetailViewController ()
@property (strong, nonatomic) IBOutlet UILabel *userLabel;
@end

@implementation UserDetailViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _userLabel.text = [NSString stringWithFormat:
                       @"_useObj.firstName: %@ \n" \
                       "_userObj.lastName: %@ \n" \
                       "_userObj.age: %ld \n" \
                       "_userObj name method: %@",
                       _userObj.firstName,
                       _userObj.lastName,
                       _userObj.age,
                       [_userObj name]];

}

@end

如果不完全清楚,这里是一个工作示例应用程序:https://github.com/DonMag/DataObjectPassing

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2013-02-27
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多