2014-03-30 30 views
0

我正在使用準備爲segue發送字符串到下一個控制器。它被設置爲一個字符串直到被髮送(根據NSLog),但只要我登錄到下一個控制器,它就是一個NSObject而不是一個字符串,因此該值已成爲空值。準備segue NSString成爲NSObject?

這是第一個視圖控制器的bodyText的領域是什麼,我試圖跨越發送到下一個視圖控制器:

#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 

這裏是接收視圖控制器的頭文件:

#import <UIKit/UIKit.h> 

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

最後接收視圖控制器的實現文件(保存方法是我稱之爲self.bodyText和它出錯,因爲它認爲bodytext爲空):

#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新手,所以任何幫助高度讚賞。謝謝。

+0

你有一個NSString作爲IBOutlet的東西似乎有點奇怪,應該是UILabel還是什麼? –

+1

從你的字符串中刪除'IBOutlet',使它成爲'copy'(而不是'weak')並且給它一個... – Alladinian

+0

你有一個弱'NSString'屬性 - 這意味着如果你指定一個對象該屬性,並沒有其他'strong'引用指向它,它將被釋放 - 看看http://stackoverflow.com/questions/11013587/differences-between-strong-and-weak-in-jective -c –

回答

1

問題出在屬性聲明中。你宣佈字符串爲weak(和IBOutlet,它不應該是這樣)。

根據ARC規則,只要所有強指針都不指向它,該對象將從內存中移除。因爲您將其設置爲prepareForSegue方法,所以在您訪問它之前它是空的。所以,你的財產申報更改爲:

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

而且在prepareForSegue方法,設置是這樣的:

... 
GFSelectGroupViewController *destViewController = segue.destinationViewController; 

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

也幫助自己調試,打印出變量的GFSelectGroupViewControllerviewDidLoad方法,看它被正確複製。

+0

這不僅工作完美,我明白爲什麼現在。非常感謝我接受並積極參與。 – jckly

相關問題