如何从多个类(视图控制器)NSObject类使用NSString

我有NSObject类有一个名为tweetTitle的NSString;

TweetDesc.h文件

#import <Foundation/Foundation.h> @interface TweetDesc : NSObject @property (strong, nonatomic) NSString * tweetTitle; -(void) setFullTweetTitle:(NSString *) fullTweetTitle; @end 

TweetDesc.m文件

 @implementation TweetDesc @synthesize tweetTitle; -(void) setFullTweetTitle:(NSString *) fullTweetTitle { self.tweetTitle = fullTweetTitle; } @end 

我有三个类(视图控制器),FirstViewController,SecondViewController和ThirdViewController。

这里是FirstViewController FirstViewController.h的代码

 @interface TweetViewController : UIViewController <UITextViewDelegate> @property (strong, nonatomic) NSString * tweet; @property (weak, nonatomic) IBOutlet UITextView *tvTweetTitle; - (IBAction)btnCreateTweet:(id)sender; @end 

FirstViewController.m

 @implementation TweetViewController @synthesize tvTweetTitle, tweet; - (void)viewDidLoad { [super viewDidLoad]; self.tvTweetTitle.delegate = self; } - (IBAction)btnCreateTweet:(id)sender { tweet = [[NSString alloc]initWithFormat:@"%@", tvTweetTitle.text]; TweetDesc * td = [[TweetDesc alloc]init]; [td setFullTweetTitle:tweet]; SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; [self.navigationController pushViewController:ivc animated:YES]; } 

我的问题是:如何在第二个和第三个ViewController中使用tweetTitle而不创buildTweetDesc类的新实例,并在每个ViewControler中再次设置tweetTitle。

在第二个视图控制器我试过了:

 TweetDesc * td = [[TweetDesc alloc]init]; NSLog(@"%@", td.tweetTitle); 

但我得到空,似乎它已经发布或其他东西。

我在这里先向您的帮助表示感谢。

首先你不需要单个属性的类只使用string。 有几种方法可以做到这一点。

  • 首先,您可以在AppDelegate中定义一个全局定义的tweet属性。
  • 您可以将variables引用从一个传递给另一个viewcontrolleres。
  • 或者,您可以使用NSUserDefaults来设置和获取文本。

在你的情况下,第一个更有用。 只是做如下

在AppDelegate.h中

定义一个属性为NSString * tweetText;

现在在你的行动

 - (IBAction)btnCreateTweet:(id)sender { AppDelegate *appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.tweetText=tvTweetTitle.text; } 

然后在任何你想访问的控制器中使用该值

 AppDelegate *appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; NSLog("%@",appDelegate.tweetText); 

NSUserDefaults可以使用相同的方法设置值

 [[NSUserDefaults standardUserDefaults] setObject:tvTweetTitle.text forKey:@"Tweet"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

并得到

 NSLog("%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"Tweet"]); 

确保在导航到其他控制器之前设置值。

以上应该解决你的目的..

只需给SecondViewController一个TweetDesc属性,就像这样:

 @interface TweetDesc : UIViewController @property (nonatomic, strong) TweetDesc *tweetDesc; ... 

然后,在你实例化一个SecondViewController ,设置它的tweetDesc属性:

 SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; svc.tweetDesc = td; [self.navigationController pushViewController:svc animated:YES]; 

在你的SecondViewController实现中,使用self.tweetDesc来访问实例。

基于你的评论,我觉得你想要你的每个视图控制器持有TweetDesc对象。 为此你可以有一个基类

 @interface baseViewController:UIViewController @property(strong, nonatomic)TweetDesc *td; @end 

你所有的viewcontrollers应该从这个基类派生。 所以你的控制器定义看起来像这样 –

 @interface FirstViewController:baseViewController ... @end @interface SecondViewController:baseViewController ... @end @interface ThirdViewController:baseViewController ... @end 

你在FirstViewController中实例化它 –

 TweetDesc * td = [[TweetDesc alloc]init]; [td setFullTweetTitle:@"whatever string you want"]; 

并将其传递给SecondViewController – //像Rob Mayoff的答案一样

 SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; svc.tweetDesc = td; [self.navigationController pushViewController:svc animated:YES]; 

SecondViewController中,您可以将其引用为self.tweetDesc 。 并使用上面的代码将其传递给你想要的任何viewcontroller。

  ThirdViewController *third= [self.storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController "]; third.tweetDesc = self.tweetDesc; [self.navigationController pushViewController:third animated:YES]; 

将它传递给任何viewcontroller只要确保它的基类是baseClassViewController。

您需要使用TweetDesc category ,在其中创build添加默认标题的方法。 或者你可以创buildTweetDesc singleton,它将始终保持一个标题。

在您的ViewController创build一个名为initWithTweetDesc的方法。 该方法将如下所示:

 - (id)initWithTweetDesc:(TweetDesc*)tweet { self = [super init]; if (self) { _tweet = tweet; } return self; } 

现在,当你想移动到新的视图控制器,运行这个代码:

 TweetViewController *vc = [[TweetViewController alloc] initWithTweetDesc:tweetDesc]; [self.navigationController pushViewController:vc animated:YES]; 

你可以使用你的AppDelegate。

eclare属性@property @property(nonatomic, strong) TweetDesc * td;AppDelegate.h文件中。

并改变方法如:

 - (IBAction)btnCreateTweet:(id)sender { tweet = [[NSString alloc]initWithFormat:@"%@", tvTweetTitle.text]; TweetDesc * td = [[TweetDesc alloc]init]; [td setFullTweetTitle:tweet]; [[[UIApplication sharedApplication] delegate] setTd:td]; SecondViewController * svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; [self.navigationController pushViewController:ivc animated:YES]; } 

而在你的第二个和第三个视图控制器,你可以使用下面的值:

 TweetDesc *desc = [[[UIApplication sharedApplication] delegate] td]; NSLog(@"%@",desc.fullTweetTitle);