当segue完成时,NSString被擦除

时间:2013-08-28 07:55:24

标签: ios objective-c nsstring storyboard

我一直在努力将xcode项目更新为storyboard样式,并将旧xcode xib中的三个视图更改为新故事板样式上的三个视图控制器即时通讯创建的字符串有问题,以便从一个视图传递数据控制器到另一个,当我切换到第三个视图控制器获取更多信息,出生日期,第一个带有初始数据的标签变成空白。

我有三个视图控制器。第一个是我有字符串* concentrationString和* DOBString。这是显示在其他视图上选择的数据的位置。

FirstViewController.h

@interface FirstViewController : UIViewController {
    IBOutlet UILabel *concentrationlabel;
    IBOutlet UILabel *DOBlabel;

}

@property (strong, nonatomic) NSString *concentrationString;
@property (strong, nonatomic) NSString *DOBString;

FirstViewController.m

#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController
@synthesize concentrationString, DOBString;

...


- (void)viewDidLoad
{
    [super viewDidLoad];

     concentrationlabel.text = concentrationString;
     DOBlabel.text = DOBString;

...

SecondViewController.m有几个药物按钮,告诉第一个视图控制器使用我发现的prepareForSegue内容将哪些值放入浓度标签

#import "SecondViewController.h"
#import "FirstViewController.h"

...

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"Adrenaline"]) {
        NSString *concentrationString = @"Adrenaline";
        FirstViewController *vc = [segue destinationViewController];
        vc.concentrationString = concentrationString; }


    else if ([segue.identifier isEqualToString:@"Morphine"]) {
        NSString *concentrationString = @"Morphine";
        FirstViewController *vc = [segue destinationViewController];
        vc.concentrationString = concentrationString; }

并根据点击的按钮,使用“Adrenaline”或“Morphine”更新第一个视图上的标签。

当用户前往ThirdViewController.m从选择器中选择患者出生日期并使用prepareForSegue方法将该值发回时,第一个标签变为空白,尽管我没有指定对concentrationString的更改< / p>

#import "DOBViewController.h"
#import "FirstViewController.h"

@interface DOBViewController ()

@end

@implementation DOBViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad {
    NSDate *now = [NSDate date];
    [picker setDate:now animated:YES];
    [DOBset setTitle:@"Date of birth" forState:UIControlStateNormal];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(IBAction)displayDate:(id)sender {
//  NSDate * selected = [picker date];
//  NSString * date = [selected description];
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"dd-MMMM-yyy"]; //24hr time format
    NSString *dateString = [outputFormatter stringFromDate:picker.date];
    [DOBset setTitle:dateString forState:UIControlStateNormal];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"DOB"]) {
        NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
        [outputFormatter setDateFormat:@"dd-MMMM-yyy"]; //24hr time format
        NSString *DOBString = [outputFormatter stringFromDate:picker.date];
        FirstViewController *vc = [segue destinationViewController];
        vc.DOBString = DOBString;
    }
}

@end

我应该怎么做? 提前谢谢。

最诚挚的问候, 库尔特。

2 个答案:

答案 0 :(得分:2)

这不起作用的原因是因为您正在为同一个视图控制器(即第一个视图控制器)创建两个不同的对象。为了从第一个控制器中可见的两个控制器获得更改,您必须获得两个控制器中第一个视图控制器的相同引用。

可以通过为AppDelegate类中的第一个视图控制器创建IBOutlet作为属性来完成 @property(非原子,强)IBOutlet FirstViewController * firstViewController;

然后通过导入AppDelegate.h使用两个类中的代码:

   AppDelegate *app=[UIApplication sharedApplication].delegate;
   FirstViewController *vc=(FirstViewController *)app.firstViewController;
   vc=[[segue destinationViewController];

Now vc will refer to the same class rather than two different objects of the FirstViewController and then you can see the changes done together.

答案 1 :(得分:0)

尝试像这样更改你的FirstViewController ......

FirstViewController.h

@interface FirstViewController : UIViewController

@property (strong, nonatomic) NSString *concentrationString;
@property (strong, nonatomic) NSString *dOBString;

@end

FirstViewController.m

#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()

// anything that isn't accessed from outside this class should be
// in the private category extension.
@property (nonatomic, weak) IBOutlet UILabel *concentrationLabel;
@property (nonatomic, weak) IBOutlet UILabel *dOBLabel;

@end

@implementation FirstViewController

...

- (void)viewDidLoad
{
    [super viewDidLoad];

     self.concentrationLabel.text = self.concentrationString;
     self.dOBLabel.text = self.dOBString;
}
...

我认为你把这个程序与ivars和属性混淆在一起,实际上并没有指向同一个东西。

使用属性时*始终使用self.property引用它。 (除非在getter,setter或构造函数中使用_property)。

通过这种方式更改代码,您应该会发现它有效。

此外,变量名称以小写字母开头并使用驼峰大小写。

即。 DOBlabel不行...... dOBLabel没问题。 浓度标签不行......浓度标签可以。