在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]

Posted

技术标签:

【中文标题】在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]【英文标题】:Passing data within an NSString between view controllers - Objective C [duplicate] 【发布时间】:2017-12-29 21:12:04 【问题描述】:

我是 ios 开发新手,并试图掌握目标 c。我在视图控制器之间传递信息时遇到问题。我已经使用整数和 NSString 玩过这段代码并且它有效,所以这告诉我 VC 正在相互交谈,并且问题与变量有关。 dataString 由 timeString 和 dateString 组成,它们在第一个视图控制器中工作正常。然后,当字符串传递给 SecondViewController 时,它们每个都有空值。在页面底部我有 NSLog 输出。谁能看到我错过了什么或我做错了什么?

第一个视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController 
    NSTimer *time;
    NSString *dateString;
    NSString *timeString;
    int milliseconds;
    int seconds;
    int minutes;
 
 - (IBAction)startButton:(UIButton *)sender;
 - (IBAction)finishButton:(UIButton *)sender;

 @property (retain) NSString *dataString; //string that will be passed 

 @property (strong, nonatomic) IBOutlet UILabel *timer;
 @property (strong, nonatomic) IBOutlet UIButton *button;
 @property (strong, nonatomic) IBOutlet UIButton *finish;

-(NSString *)getData; //I'm not sure why I need this here
@end 

第一个视图控制器.m

 #import "ViewController.h"
 #import "SecondViewController.h"
 @interface ViewController ();

 @end

 @implementation ViewController

 - (IBAction)startButton:(UIButton *)sender 
     //timer interval increments by milliseconds in updateTimer
     time = [NSTimer scheduledTimerWithTimeInterval:.01 target:self 
         selector:@selector(updateTimer) userInfo:nil repeats:YES];
     NSDate *date = [NSDate date];
     dateString = [self getDate: date]; //saves date and time the button was pressed 
 

-(void)updateTimer 
    milliseconds += 1;
    if (milliseconds == 99)
        seconds += 1;
        milliseconds = 0;
    
    if (seconds == 59)
        minutes += 1;
        seconds = 0;
    
    timeString = [NSString stringWithFormat: @"%02i:%02i.%02i", minutes, seconds, milliseconds]; //formats display time in string
    self.timer.text = timeString;


-(NSString *)getDate : (NSDate *)date
    date = [NSDate date]; //updates object with current date
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MMM dd, yyyy hh:mm a"]; //formats date
    dateString = [dateFormatter stringFromDate:date]; //converts date object to string
    return dateString;


- (IBAction)finishButton:(UIButton *)sender 
    //button navigates to next view controller
    if (seconds > 0)
        [self getData]; //print current values before trying to pass
    
    milliseconds = 0; //resets timer
    seconds = 0;
    minutes = 0;
    self.timer.text = @"00:00.00";


 //getter method do send string to next view controller 
-(NSString *)getData
    dataString = [NSString stringWithFormat:@"%@ on %@", timeString, dateString]; //format data
    NSLog(@"%@ %@", dateString, timeString); //to double check values
    return dataString;


@end

第二个视图控制器.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface dataScreenViewController : UIViewController 
    NSString *string; //string that I'm trying to pass
    ViewController *information //object for view controller class 

- (IBAction)press:(UIButton *)sender; //button to display string 
@end  

第二个视图控制器.m

#import "SecomdViewController.h"
#import "ViewController.h"

@interface SecondViewController ()

@end

- (void)viewDidLoad 
    [super viewDidLoad];
    information = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];


- (IBAction)press:(UIButton *)sender 
    string = [information getData];
    NSLog(@"%@", string); //prints the string
 

NSLog 输出:

2017-12-29 12:47:49.792138-0800 MyFirstProject[6659:333408] 2017 年 12 月 29 日 12:47 PM 00:01.50

2017-12-29 12:47:52.499692-0800 MyFirstProject[6659:333408] (null) (null)

2017-12-29 12:47:52.499910-0800 MyFirstProject[6659:333408] (null) on (null)

由于第一个打印输出具有正确的信息,我假设在第一个 VC 中一切正常,但是当我传递它时,字符串中变量中的信息会丢失。

编辑: 这是 ViewController 相互交谈以传递一个 int 和一个字符串的示例。我只是在 getData 方法中进行了更改:

-(NSString *)getData
    NSString *string = @"This is a string";
    string = [NSString stringWithFormat:@"%i on %@", 3, string];
    return string;

然后我仍然在第二个视图控制器中以相同的方式访问它:

- (IBAction)press:(UIButton *)sender 
    NSString *string = [information getData];
    NSLog(@"%@", string); 

然后输出是:

2017-12-30 09:07:40.764295-0800 MyFirstProject[8435:460529] 3 on 这是一个字符串

【问题讨论】:

这一行information = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 从 nib 文件中实例化了一个全新的 ViewController,除了作为变量之外,它没有在任何地方使用。它不是对您可能正在使用的任何其他 ViewController 实例的引用。所以你得到了默认值。 惰性方法是数据的单例/全局存储。正确的方法是在 #2 上拥有一个属性,然后在 #1 中实现 prepareForSegue 方法,在其视图生命周期开始之前将数据分配给 #2 上的该属性。 @UpholderOfTruth,我可以使用相同的代码来传递一个 int 或普通字符串,所以我认为 ViewController 对象工作正常。你知道为什么 ViewController 对象在当前场景中的行为会有所不同吗? @ghostatron,您能否详细说明如何在这种情况下使用 prepareForSeque?苹果开发者文档帮助不大 显示您用于 Int 和“正常”字符串的代码,确保它确实在做您认为它正在做的事情。 【参考方案1】:

您的第二个视图控制器创建了一个新的非活动/死 ViewController 对象,名为 information。而且,您不会在 information 上调用任何会初始化其日期变量的方法。

所以informationtimeStringdateString 没有被初始化。在 Objective-C 中,未初始化的变量是 NULL。这就是您在输出中看到(null) 的原因。

假设您只需要一个 ViewController 对象,您想在第二个视图控制器中使用它。如果是这种情况,您必须将 ViewController 的引用传递给您的第二个视图控制器。

【讨论】:

以上是关于在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSManagedObject 对象在视图控制器之间传递自定义属性?

如何在 iOS SDK 中使用 presentViewController 在视图控制器之间传递变量?

使用 initWithIdentifier 传递 NSString

通过 prepareForSegue 传递 NSString - Swift

在多个视图控制器之间传递数据[重复]

试图在两个视图控制器之间传递数据