ios - 准备 segue NSString 变成 NSObject?

标签 ios

我正在使用准备转场将字符串发送到下一个 Controller 。在发送之前它被设置为一个字符串(根据 NSLog),但是当我将它记录到下一个 Controller 上时,它是一个 NSObject 而不是字符串,因此该值已变为 null。

这是第一个 View Controller ,bodyText 字段是我试图发送到下一个 View Controller 的内容:

#import "GFAddPostTextViewController.h"
#import "GFSelectGroupViewController.h"

@interface GFAddPostTextViewController ()
@property (weak, nonatomic) IBOutlet UITextField *bodyTextField;
@end

@implementation GFAddPostTextViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

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

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

        GFSelectGroupViewController *destViewController = segue.destinationViewController;

        destViewController.bodyText = self.bodyTextField.text;

        NSLog(@"%@", destViewController.bodyText);

    }

}


@end 

这是接收 View Controller 的头文件:

#import <UIKit/UIKit.h>

@interface GFSelectGroupViewController : UITableViewController
@property (weak, nonatomic) IBOutlet NSString *bodyText;
@end

最后是接收 View Controller 的实现文件(save 方法是我调用 self.bodyText 的地方,它认为 bodytext 为 null 时出错):

#import "GFSelectGroupViewController.h"
#import <AFNetworking.h>
#import "GFCredentialStore.h"
#import "GFGroupResponseSerializer.h"

#define kBaseURL "http://someserver.com/"
#define kGroupURL "groups.json"
#define kPostURL "posts.json"

@interface GFSelectGroupViewController ()
@property (nonatomic, strong) NSArray *groups;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *saveButton;
@end

@implementation GFSelectGroupViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    GFCredentialStore *credentialStore = [[GFCredentialStore alloc] init];

    NSString *authToken = [credentialStore authToken];
    NSLog(@"%@", authToken);

    __weak typeof(self)weakSelf = self;

    [self.saveButton setTarget:self];
    [self.saveButton setAction:@selector(save:)];

    NSString *urlString = [NSString stringWithFormat:@"%s%s", kBaseURL, kGroupURL];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [GFGroupResponseSerializer serializer];
    [manager.requestSerializer setValue:authToken forHTTPHeaderField:@"auth_token"];
    NSLog(@"%@", manager.requestSerializer.HTTPRequestHeaders);
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        __strong typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.groups = (NSArray *)responseObject;
        [strongSelf.tableView reloadData];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

-(void)save:(id)sender {

    NSString * postURL = [NSString stringWithFormat:@"%s%s", kBaseURL, kPostURL];

    NSString *body = self.bodyText;
    NSLog(@"%@", body);

    NSDictionary *params = @{ @"post[body]" : body};


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:postURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        [self dismissViewControllerAnimated:NO completion:nil];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

}

iOS 新手,非常感谢任何帮助。谢谢。

最佳答案

问题出在属性声明中。您将字符串声明为 weak(和 IBOutlet,它不应该也是如此)。

ARC规则,一旦所有强指针不再指向该对象,该对象就会从内存中删除。因为您在 prepareForSegue 方法中设置了它,所以在您访问它之前它已被清空。因此,将您的属性(property)声明更改为:

@interface GFSelectGroupViewController : UITableViewController
@property (strong, nonatomic) NSString *bodyText;
@end

并且在prepareForSegue方法中,这样设置:

...
GFSelectGroupViewController *destViewController = segue.destinationViewController;

destViewController.bodyText = [self.bodyTextField.text copy];
...

同时帮助自己进行调试,打印出 GFSelectGroupViewControllerviewDidLoad 方法中的变量,以查看它是否被正确复制。

关于ios - 准备 segue NSString 变成 NSObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748908/

相关文章:

ios - 如何替换URL中的占位符字母?

ios - 在按钮操作上实例化 UINavigationController

ios - UIDynamicAnimator项目(in :)在iOS 11中崩溃

android - Cordova 3.3.1-0.1.2 (Phonegap) 插件不工作

ios - 唯一识别iOS设备的最佳方法?

ios - 确定 iOS 设备上可用的最大 PHAsset 图像大小

iOS - 如何下载音频文件

iphone - Objective-C 错误

ios - 我如何处理对单个按钮的多次单击操作以进行 api 调用并从 api 获取真实响应

iphone - 为键盘切换 UIPicker