0

我有一个 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

第一视图控制器.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 而无需创建 TweetDesc 类的新实例并在每个 ViewControler 中再次设置 tweetTitle。

在我尝试的第二个视图控制器中:

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

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

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

4

6 回答 6

2

只需给出SecondViewController一个TweetDesc属性,如下所示:

@interface TweetDesc : UIViewController

@property (nonatomic, strong) TweetDesc *tweetDesc;

...

然后,在实例化 a 之后SecondViewController,设置它的tweetDesc属性:

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

在您的SecondViewController实现中,用于self.tweetDesc访问实例。

于 2013-04-02T08:47:20.120 回答
1

首先,您不需要单个属性的类,仅使用字符串。有几种方法可以做到这一点。

  • 首先,您可以在AppDelegate中全局定义一个 tweet 属性。
  • 您可以将变量引用从一个视图控制器传递到另一个视图控制器。
  • 或者,您可以使用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"]);

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

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

于 2013-04-02T08:40:50.460 回答
1

根据您的评论,我觉得您希望每个视图控制器都持有一个TweetDesc对象。为此,您可以有一个像这样的基类

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

你所有的视图控制器都应该派生自这个基类。所以你的控制器定义看起来像这样 -

@interface FirstViewController:baseViewController
...
@end

@interface SecondViewController:baseViewController
...
@end

@interface ThirdViewController:baseViewController
...
@end

U 在 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. 然后使用上面的代码将其传递给您想要的任何视图控制器。

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

将它传递给任何视图控制器,只需确保它的基类是 baseClassViewController。

于 2013-04-02T09:58:12.317 回答
0

您需要使用categorywhereTweetDesc您创建添加默认标题的方法。或者您可以创建TweetDesc一个始终拥有一个标题的单例。

于 2013-04-02T08:29:14.390 回答
0

在您ViewController创建一个名为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];
于 2013-04-02T08:29:30.453 回答
0

您可以为此使用 AppDelegate。

@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);
于 2013-04-02T08:40:12.933 回答