2017-03-25 14 views
0

私は、textFieldとボタンを含むVCを持っています。 textFieldテキストデータをモデルエンティティに渡す単純なタスクがあります。しかし、textFieldデータをエンティティデータに割り当てたいのですが、データはゼロのままです。 私はこのような問題を引き起こしているかを理解することはできません変数代入後の値なし

class InputTextViewController: UIViewController { 

    @IBOutlet weak var messageTextField: UITextField! 

    //I receive user from parent VC by segue 
    var userSendMessageTo: User! 
    var tableView: UITableView? 
    var message: Message { return Message(userSendMessageTo) } 
    // initialising object of my entity class 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(userSendMessageTo.name) 
     //name is right 
    } 

    func createMessage() { 
     message.messageText = messageTextField.text 
     message.messageTime = Date() 
     print(message.messageText) //nil 
     print(message.messageTime) //nil 

    } 


    @IBAction func sendMessge(_ sender: Any) { 

     createMessage() 
     userSendMessageTo.mesaageHistory.append(message) 

     print(userSendMessageTo.mesaageHistory[0].messageText) //nil 
    } 

マイモデル

class Message { 

    var messageText: String? 
    var messageTime: Date? 
    var messageInage: UIImage? 
    var user: User 

    init(_ user: User) { 
     self.user = user 
    } 

} 

class User { 

    let name: String 

    var mesaageHistory = [Message]() 

    init(name: String) { 
     self.name = name 
    } 


} 
+1

あなたはあなたのタグに 'Swift'を意味し、' Objective-C'は意味しないと思います。 –

答えて

2

構築物はvar message: Message { return Message(userSendMessageTo) }新しいMessageオブジェクトメソッドが呼び出されるたびに返されます。

したがって、メッセージオブジェクトを作成し、そこにテキストを割り当ててから投げ捨てます。次に、2番目のメッセージオブジェクトを作成し、それに日付を割り当てて投げ捨てます。次に、3番目のメッセージオブジェクトを作成し、そのテキスト(nil)をチェックしてから、4番目のメッセージオブジェクトを作成し、その日付をチェックします。これもnilです。

代わりにこれを試してください:あなたは変数計算としてmessageを宣言した

class InputTextViewController: UIViewController { 

    @IBOutlet weak var messageTextField: UITextField! 
    var userSendMessageTo: User! 
    var tableView: UITableView? 
    var message: Message? 

    func createMessage() { 
     message = Message() 
     message!.messageText = messageTextField.text 
     message!.messageTime = Date() 
     print(message!.messageText) //won't be nil 
     print(message!.messageTime) //won't be nil 
    } 
} 
2

。これは、あなたが参照するたびにmessageあなたが実際に次のコードブロックを実行していることを意味します。つまり

Message(userSendMessageTo) 

は、messageへの各参照がMessageの新しいインスタンスを作成します。

  • message.messageText = messageTextField.textからMessage
  • message.messageTime = Date()の新しいインスタンスを作成します - Message
  • print(message.messageTime)の新しいインスタンスを作成します - メッセージの新しいインスタンスを作成し、そのmessageTimeプロパティがあり
  • ゼロ

ですここでプロパティを使う必要はありません。あなたのcreateMessage関数は、新しいMessageを返す必要があります:

func createMessage(withText text: text) -> Message { 
    let message = Message(userSendMessageTo) 
    message.messageText = text 
    message.messageTime = Date() 
    return message 
} 

@IBAction func sendMessge(_ sender: Any) { 

    let message = self.createMessage(withText: messageTextField.text) 
    userSendMessageTo.mesaageHistory.append(message) 

    print(userSendMessageTo.mesaageHistory[0].messageText) 
} 

あなたがMessageのための適切な初期化子を作成する場合は、完全にcreateMessage機能を取り除くことができ、正直に言うと:

class Message { 

    var messageText: String 
    var messageTime: Date 
    var messageInage: UIImage? 
    var user: User 

class Message { 

    var messageText: String 
    var messageTime: Date 
    var messageInage: UIImage? 
    var user: User 

    init(_ user: User, text: String = "", date: Date = Date()) { 
     self.user = user 
     self.messageTime = date 
     self.messageText = text 
    } 

} 

そして、単にあなたのアクションメソッド

@IBAction func sendMessge(_ sender: Any) { 
    let message = Message(userSendMessageTo, text: messageTextField.text, date:Date()) 
    userSendMessageTo.mesaageHistory.append(message) 

    print(userSendMessageTo.mesaageHistory[0].messageText) 
} 
関連する問題