在视图控制器之间的 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
上调用任何会初始化其日期变量的方法。
所以information
的timeString
和dateString
没有被初始化。在 Objective-C 中,未初始化的变量是 NULL
。这就是您在输出中看到(null)
的原因。
假设您只需要一个 ViewController
对象,您想在第二个视图控制器中使用它。如果是这种情况,您必须将 ViewController
的引用传递给您的第二个视图控制器。
【讨论】:
以上是关于在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NSManagedObject 对象在视图控制器之间传递自定义属性?
如何在 iOS SDK 中使用 presentViewController 在视图控制器之间传递变量?
使用 initWithIdentifier 传递 NSString