【问题标题】:Sharing data/string with a singleton between views在视图之间与单例共享数据/字符串
【发布时间】:2011-12-05 15:57:14
【问题描述】:

我正在尝试在我的 iPhone 项目的两个视图之间共享一个字符串。如果我使用实际的@"something here" 作为字符串,它目前可以工作,但如果我想使用 label.text 之类的东西,即使它仍然是一个字符串,它也不会。

我会告诉你我必须让你更清楚。

第一个视图:Info_ViewController.h

#import <UIKit/UIKit.h>

@interface Info_ViewController : UIViewController {

    IBOutlet UITextField *locationField;

}

@property (nonatomic, retain) NSString *locationString;

+ (id)sharedInfoVC;

@end

第一个视图:Info_ViewController.m

#import "Info_ViewController.h"

static Info_ViewController *sharedInfoVC = nil;

@implementation Info_ViewController
@synthesize locationString;


#pragma mark Singleton Methods
+ (id)sharedInfoVC {
    @synchronized(self) {
        if (sharedInfoVC == nil)
            sharedInfoVC = [[self alloc] init];
        }
    return sharedInfoVC;
}

- (id)init {
    if (self = [super init]) {
        locationString = [[NSString alloc] initWithString:locationField.text]; //This is there part I mentioned earlier, when using @"something" instead of locationField.text works.
    }
    return self;
}

第二个视图:Confirm_ViewController.m

#import "Confirm_ViewController.h"
#import "Info_ViewController.h"

@implementation Confirm_ViewController

- (IBAction)buttonZ:(id)sender
{
    Info_ViewController *infoVCmanager = [Info_ViewController sharedInfoVC];
    locationLabel.text = infoVCmanager.locationString;
}

我现在把它放在一个按钮下,但它最终会在 viewDidLoad 下。 如果您将 locationField.text 替换为字符串 (@"blahblahblah"),它不会崩溃并且可以正常工作。

当它崩溃时,我收到错误:程序收到信号:“SIGABRT”

编辑:我尝试改变

initWithString:locationField.text

initWithFormat:@"%@",locationField.text

现在我在第二个视图中的标签打印“(NULL)”

感谢您抽出宝贵时间提供建议,非常感谢。

【问题讨论】:

  • 尝试声明 locationString。
  • 我尝试将它作为 ivar 添加到 Info_ViewController.h,但它没有改变任何东西。你的意思是让我在别处声明吗?

标签: iphone objective-c xcode4 ios5 singleton


【解决方案1】:

将 nil 作为格式字符串传递给 -[NSString initWithString] 是错误的。

那么你是如何传递 nil 的?您实际上有 两个 Info_ViewController 实例。您有一个实例,它是应用程序的正常部分,然后您还有一个 second 实例,它是您的“单例”(实际上不再是单例了)。

因此,在您的“单例”实例中,UITextField 为 nil(并且将始终为 nil),因此 locationField.text 为 nil,您将其传递给 initWithString:,这是一个崩溃。事实上,“单例”甚至还没有像视图控制器那样完全成熟。

如果您希望单例在应用程序的其他地方共享数据,它真的不应该是 Info_ViewController 或任何类型的视图控制器。它应该属于您用来管理数据的其他类。我会创建另一个类并将其实现为单例。

希望能帮助您了解这里发生的事情。

【讨论】:

  • 我在网上冲浪时意识到了这一点,我只是希望这种方式也能奏效。谢谢,今晚我会试试这个。
  • 好的,这很完美,而且这种方式也更简单。感谢您的帮助。
【解决方案2】:

在前面加上“self”。到您的位置字符串。

    self.locationString = [[NSString alloc] initWithString:locationField.text]; 

【讨论】:

  • 当它崩溃时我得到错误:程序收到信号:“SIGABRT”
【解决方案3】:

根据我对您的代码的理解,当您在初始化 viewController 时从文本字段中获得 locationString 的值。此时,您的文本字段将不可见。在它变得可见并输入内容后,您没有将其存储到 locationString 的代码。

你应该做的是等待 Info_ViewController 对象被初始化和显示。然后在按下某个按钮或某些其他事件时,从 locationString 甚至直接从 locationField.text 分配 locationLabel.text。

我会提供代码,但我不知道你是如何构建它的。如果您仍需要帮助,请提供详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多