【问题标题】:NSString property loses value in IBAction methodNSString 属性在 IBAction 方法中失去价值
【发布时间】:2012-12-26 15:31:29
【问题描述】:

我在 Viewcontroller 中有一个 NSString 属性 self.textFromTextVC,它的值在 IBAction 方法中变为空。

- (IBAction)buttonPressed:(id)sender
{

    NSLog(@"text before alarm is created: %@", self.textFromTextVC);

}

以下方法位于同一个“.m”文件中,它们保留 NSString 属性的值。

-(void)setPropertyTextToReceivedText:(NSString *)text
{

    self.textFromTextVC = text;

    NSLog(@"text received from text VC: %@", self.textFromTextVC);

    [self doesStringKeepValue]; //I call this method to check and see if the NSString value     
                                //was retained

}

-(void)doesStringKeepValue
{

    NSLog(@"keep value: %@", self.textFromTextVC); //NSString value the same from the above
                                                   //method
}

以下是我声明 NSString 属性的方式:

@property (nonatomic, copy) NSString *textFromTextVC;

基本上,我在调用 IBAction 方法之前设置了self.textFromTextVC,这就是我感到困惑的原因。我真的不确定发生了什么。我选择了 ARC。 我希望我只是犯了一个简单的错误......帮助? 谢谢,

下面是我调用 setPropertyTextToReceivedText 的另一个视图控制器中的方法:

@implementation TextViewController

@synthesize typedText;


- (IBAction)doneButton:(id)sender {

    [self.typedText resignFirstResponder];

    AlarmViewController *receiver = [[AlarmViewController alloc]init];
    [receiver setPropertyTextToReceivedText:self.typedText.text];

    //[self showAlert];
}

【问题讨论】:

  • textFromTextVC 的值在buttonPressed: 中不能为空,因为没有代码可以导致它。在调用该方法之前它已经为 null。因此,请显示最初为 textFromTextVC 分配任何值的代码。
  • 你在哪里打电话setPropertyTextToReceivedText给我们看代码
  • @Codo 我在 setPropertyTexttoReceivedText 方法中分配 self.textFromTextVC。
  • @InderKumarRathore 下面是我调用 setPropertyTextToReceivedText 的另一个视图控制器中的方法:
  • 我可以在 AlarmViewController 中看到 NSString 值,只是在 IBAction 方法中看不到。

标签: objective-c properties nsstring ibaction


【解决方案1】:

您的问题是 receiver 与您的 VC 显示的对象不同(当前/推送)。

AlarmViewController *receiver = [[AlarmViewController alloc]init];
[receiver setPropertyTextToReceivedText:self.typedText.text];

【讨论】:

  • 我不知道为什么上面的代码不正确,因为它是在 textViewController 中调用的,所以 ViewController 对象需要是类 alarmViewControler 以便方法 'setPropertyTextToReceivedText' 可以工作?有错吗?
  • @adam 只需显示您拥有 pushed or presentedAlarmViewController 的代码。我的观点是您的 pushed AlarmViewController 对象与您在 doneButton 按钮事件中创建的对象不同
  • @adam,如果你在receiver 上调用setPropertyTextToReceivedText,你需要展示/推送同一个视图控制器。如果您正在创建另一个 AlarmViewController 并展示它,您将不会看到该值设置在那里。
【解决方案2】:

改变这个:

NSLog(@"text before alarm is created: %@", self.textFromTextVC);

到这里:

NSLog(@"%@: text before alarm is created: %@", self, self.textFromTextVC);

它可能会告诉你,你确实在查看同一个类的两个不同的对象实例。

【讨论】:

    【解决方案3】:

    我想你忘记了:

    @synthesize textFromTextVC;
    

    【讨论】:

    • 它根本不需要... @synthesize 以前使用过 :)
    • @AnoopVaidya 真的吗???出乎我的意料!但我认为self.textFromTextVC = text 的唯一原因不起作用,因为textFromTextVC 根本没有设置..
    • 在较新的 xcode 中,您只定义 @property@synthesize 是自动完成的。它不可见。但是你可以自己覆盖它。
    • @AnoopVaidya 你是说最新的吗?听起来很酷,但 OP 可能仍使用旧版本。 :p
    • 啊哈,是的,但是在使用self.property 时他得到了 nil。我想我们不需要再讨论这个了。这是无止境的..我认为OP'll解开我们的疑虑。 ;)
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多