【问题标题】:Assigning text from a TextField to NSString in another Class将 TextField 中的文本分配给另一个类中的 NSString
【发布时间】:2012-08-22 07:42:23
【问题描述】:

所以我有一个叫做 Player 的 NSObject

Player.h
@interface Player : NSObject{
    NSString *PlayerName;
}
@property (nonatomic, retain, strong) NSString *PlayerName;
Player.m
@synthesize PlayerName;

然后在我的 MainViewController.h 中

#import "Player.h"
@interface ViewController : UIViewController<UITextFieldDelegate>{
Player *MainPlayer;
}
@property (weak, nonatomic) IBOutlet UITextField *TextField;

ViewController.m

- (void)textFieldDidEndEditing:(UITextField *)textField {
    Choice = TextField.text;
    [MainPlayer setName:Choice];
    NSLog(@"Choice: %@ Name: %@",Choice, MainPlayer.PlayerName);
}

这应该可以工作,除了 NSLog 返回 选择:(输入给定)名称:(空)

我尝试更改我的代码,但没有任何效果 :P 感谢您的帮助:)

【问题讨论】:

  • 我看到在 ViewController.m 中你调用了[MainPlayer setName: Choice],但在实际的播放器类中该属性被调用为PlayerName。那是错字吗?如果不是,这可能是原因。

标签: objective-c nsstring nstextfield nsobject


【解决方案1】:

它认为你错过了这一行。

MainPlayer = [[Player alloc]init]

在设置实例值之前,您需要分配对象。您可以在 viewDidLoad 中分配它。 然后设置实例的值

 MainPlayer.PlayerName = field.text;

 [MainPlayer setPlayerName:field.text];

【讨论】:

  • 谢谢,我忘记第一行了:)
【解决方案2】:

首先,对于 NSString 属性,我会使用复制,而不是强。这避免了认为 NSString 是不可变的,但被交给了一个 NSMutableString ,然后它会改变。

默认情况下,@synthesize 会为其创建一个 _propertyName 变量,因此您可能会发现正在发生的事情是您的 NSString *PlayerName;只是被忽略,有利于自动合成 NSString *_PlayerName;成员变量。

我会这样做

转储NSString *PlayerName; 删除@synthesize PlayerName 使用@property (nonatomic, retain, copy) NSString *PlayerName;

看看这对你有什么作用。

【讨论】:

    【解决方案3】:

    几条线索:

    • MainPlayer 是否在ViewController.h 中正确初始化(即使用时不为零)?

    • 以下行:

       [MainPlayer setName:Choice];
      

      应该改为:

       [MainPlayer setPlayerName:Choice];
      

    旁注:变量名不应以大写字母开头。

    【讨论】:

    • 好吧,实际上,setName 是一种方法 xD。而且我忘记初始化 MainPlayer。谢谢你的建议和帮助:)
    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多