2017-03-25 65 views
0

我有一个包含textField和button的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) }返回每次它被称为一次新的消息对象。

因此,您正在创建一个消息对象,为其分配文本,然后将其扔掉。然后,您创建第二个消息对象,为其分配一个日期并将其丢弃。然后创建第三个消息对象并检查其文本(无),然后创建第四个消息对象并检查其日期,也是零。

试试这个:

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你实际上是在执行下面的代码块:

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) 
}