如何从多个类(视图控制器)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);