【问题标题】:How to use NSString from NSObject class in multiple Classes (View Controllers) [duplicate]如何在多个类(视图控制器)中使用 NSObject 类中的 NSString [重复]
【发布时间】:2013-04-02 08:23:46
【问题描述】:

我有一个 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 而无需创建 TweetDesc 类的新实例并在每个 ViewControler 中再次设置 tweetTitle。

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

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

但我得到 null,似乎它已经发布或其他什么。

提前感谢您的帮助。

【问题讨论】:

  • 当你写 TweetDesc * td = [[TweetDesc alloc]init]; 时,对于 secondViewController,你还没有为实例变量 tweetTitle 分配任何值,因此为空。如果你写[td setFullTweetTitle:@"some string"]; THEN 它被赋值。

标签: iphone ios objective-c xcode


【解决方案1】:

只需给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 访问实例。

【讨论】:

  • 我喜欢这个答案,它在第二个视图控制器上运行良好。但它不适用于第三个视图控制器。这个想法是从视图控制器 1 收集一些数据并存储它 tweetDesc 他们移动到视图控制器 2 并收集一些数据并存储它们,最后在视图控制器 3 中检索它们。
【解决方案2】:

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

  • 首先,您可以在 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"]);

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

以上应该可以解决您的目的..

【讨论】:

  • 谢谢,效果很好。
  • 如果解决了,你可以选择这个作为答案。这将有助于其他人找到答案。谢谢。
  • @Downvoter:请解释一下!谢谢。
【解决方案3】:

根据您的评论,我觉得您希望每个视图控制器都持有一个 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];

INSIDE SecondViewController 你可以把它称为self.tweetDesc。然后使用上面的代码将其传递给您想要的任何视图控制器。

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

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

【讨论】:

    【解决方案4】:

    您需要使用categoryTweetDesc 来创建添加默认标题的方法。或者,您可以创建始终包含一个标题的 TweetDesc 单例。

    【讨论】:

    • Singleton 不是一个好主意,因为他可能想要多个TweetDescs。最好将指针作为参数传递。
    【解决方案5】:

    在您的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];
    

    【讨论】:

    • 他正在从情节提要中实例化SecondViewController。创建自定义的 init 方法是行不通的,因为他必须使用 instantiateViewControllerWithIdentifier: 来创建它,而不是自定义的 init 方法。
    • 他已经提到过:无需创建 TweetDesc 类的新实例并在每个 ViewControler 中再次设置 tweetTitle 您的解决方案需要在每个视图控制器中声明 TweetDesc 的属性。
    【解决方案6】:

    您可以为此使用 AppDelegate。

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

    并改变方法,如:

    - (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);
    

    【讨论】:

    • 另一个坏主意。为什么他需要使用 AppDelegate 来传递一个简单的指针?如果他需要第二个或第三个 TweetDesc 怎么办?在 AppDelegate 中再创建 2 个属性?
    • @EliGanem:OP 只需要在第二个和第三个视图控制器中传递 Tweet 对象,而无需在这些视图控制器中声明属性。所以我认为这是最好的方法之一。如果他需要更多对象,他可以在每个类中声明属性,也可以在 AppDelegate 中声明一个数组。我按照他的问题回答。如果他需要更多,他需要修改它。这只是一个建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多