Как передать объект данных для просмотра контроллера, встроенного в контроллер навигации в другой раскадровке - PullRequest
0 голосов
/ 31 марта 2020

Мой код, который обычно работает нормально для передачи объекта другому контроллеру представления, не работает, когда контроллер представления находится в другой раскадровке.

Мой код загружает правильный контроллер представления, встроенный в его контроллер навигации, но без любые данные. (Объект данных равен nil в месте назначения V C).

Вот код, который я пытаюсь использовать;

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];

Выше загружен V C с нет данных.

Я могу передать объект данных в V C, если я представляю V C напрямую без контроллера навигации. Но в этом случае я теряю необходимые мне функции навигации.

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];

Что может быть не так с приведенным выше кодом и какой код использовать.

Редактировать:

Я могу передать обычный объект, такой как String, в V C, встроенный в nav. Или я могу передать пользовательский объект в V C, когда он не встроен в nav. Я просто не могу передать пользовательский объект, такой как пользователь, или я создал другой объект NSObject для тестирования в V C, когда он встроен в навигационную систему. Возможно, это странный сбой при использовании другой раскадровки.

Edit 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

Это свойство в V C:

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

Следующий код в ViewDidLoad не оказывает никакого влияния, и пользователь появляется как ноль:

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

po self.user.name в отладчике показывает ноль po self.user в отладчиках показывает ноль

1 Ответ

1 голос
/ 01 апреля 2020

Не уверен, не увидев полный пример вашего кода, но я, должно быть, вам чего-то не хватает ...

Вот полный пример. Должно быть очевидно, что подключается к @IBOutlet и @IBAction (и идентификаторам раскадровки):

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 (V C во второй раскадровке)

//
//  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

...