我有一个Tableview,它返回nil.I叫做tableView massageTableView。我是swift的新人。所以我做错了什么?
class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var messageLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var txtMessage: UITextField!
var usernamefield:UITextField?
var serverIpfield:UITextField?
var confirmButton:UIButton?
var alert : UIAlertController?
var serverIP = "192.168.1.3:120"
var nickName = "Murat"
var clientSocket: TCPClient?
var toolbar: UIToolbar?
@IBOutlet var messageTableView: UITableView!
var messages:[Message]=[]
var textView: UITextView = UITextView(frame: CGRectZero)
override func viewDidLoad() {
super.viewDidLoad()
/* func messagetableViewFunc() {
messageTableView.dataSource = self
messageTableView.delegate = self
//let nibName = UINib(nibName: "MessageCell", bundle:nil)
//self.messageTableView.registerNib(nibName, forCellReuseIdentifier: "MessageCell")
self.messageTableView.registerNib(UINib(nibName: "MessageCell", bundle:nil ), forCellReuseIdentifier: "MessageCell")
self.messageTableView.rowHeight = UITableViewAutomaticDimension;
self.messageTableView.estimatedRowHeight = 44.0;
self.messageTableView.keyboardDismissMode = .Interactive
self.view.addSubview(self.tableView!)
} */
self.navigationItem.hidesBackButton=true
self.view.backgroundColor=UIColor.whiteColor()
messageTableView.dataSource = self
messageTableView.delegate = self
//let nibName = UINib(nibName: "MessageCell", bundle:nil)
//self.messageTableView.registerNib(nibName, forCellReuseIdentifier: "MessageCell")
self.messageTableView.registerNib(UINib(nibName: "MessageCell", bundle:nil ), forCellReuseIdentifier: "MessageCell")
self.messageTableView.rowHeight = UITableViewAutomaticDimension;
self.messageTableView.estimatedRowHeight = 44.0;
self.messageTableView.keyboardDismissMode = .Interactive
self.view.addSubview(self.tableView!)
serverIP = serverIpfield!.text
nickName = usernamefield!.text
// Do any additional setup after loading the view, typically from a nib.
}
func doInBackground(block:()->()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
block()
})
}
func sendMesage(msgtosend: NSDictionary) {
var msgdata=NSJSONSerialization.dataWithJSONObject(msgtosend, options: NSJSONWritingOptions.PrettyPrinted, error: nil)
var len = Int32(msgdata!.length)
var data:NSMutableData = NSMutableData(bytes: &len, length: 4)
self.clientSocket!.send(data: data)
self.clientSocket!.send(data: msgdata!)
}
override func canBecomeFirstResponder() -> Bool {
return true
}
func disconnect(){
}
func proccessMessage(msg:NSDictionary){
var cmd: String = msg["cmd"] as String
switch(cmd){
case "msg" :
self.messages.append(Message(from: msg["from"] as String, incoming: true, text: msg["context"]as String, sentDate: NSDate()))
self.messageTableView!.reloadData()
default:
print(msg)
}
}
override var inputAccessoryView: UIView! {
get {
if toolbar == nil {
toolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 44))
textView.backgroundColor = UIColor(white: 250/255, alpha: 1)
textView.font = UIFont.systemFontOfSize(17.0)
textView.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 200/255, alpha: 1).CGColor
textView.layer.borderWidth = 0.5
textView.layer.cornerRadius = 5
textView.scrollsToTop = false
textView.textContainerInset = UIEdgeInsetsMake(4, 4, 3, 3)
toolbar!.addSubview(textView)
var sendButton = UIButton.buttonWithType(.System) as UIButton
sendButton.titleLabel?.font = UIFont.boldSystemFontOfSize(17)
sendButton.setTitle("Send", forState: .Normal)
sendButton.setTitleColor(UIColor(red: 142/255, green: 142/255, blue: 147/255, alpha: 1), forState: .Disabled)
sendButton.setTitleColor(UIColor(red: 1/255, green: 122/255, blue: 255/255, alpha: 1), forState: .Normal)
toolbar!.addSubview(sendButton)
textView.setTranslatesAutoresizingMaskIntoConstraints(false)
sendButton.setTranslatesAutoresizingMaskIntoConstraints(false)
toolbar!.addConstraint(NSLayoutConstraint(item: textView, attribute: .Left, relatedBy: .Equal, toItem: toolbar, attribute: .Left, multiplier: 1, constant: 8))
toolbar!.addConstraint(NSLayoutConstraint(item: textView, attribute: .Top, relatedBy: .Equal, toItem: toolbar, attribute: .Top, multiplier: 1, constant: 7.5))
toolbar!.addConstraint(NSLayoutConstraint(item: textView, attribute: .Right, relatedBy: .Equal, toItem: sendButton, attribute: .Left, multiplier: 1, constant: -2))
toolbar!.addConstraint(NSLayoutConstraint(item: textView, attribute: .Bottom, relatedBy: .Equal, toItem: toolbar, attribute: .Bottom, multiplier: 1, constant: -8))
toolbar!.addConstraint(NSLayoutConstraint(item: sendButton, attribute: .Right, relatedBy: .Equal, toItem: toolbar, attribute: .Right, multiplier: 1, constant: 0))
toolbar!.addConstraint(NSLayoutConstraint(item: sendButton, attribute: .Bottom, relatedBy: .Equal, toItem: toolbar, attribute: .Bottom, multiplier: 1, constant: -4.5))
}
return toolbar!
}
}
func sendAction() {
var content = textView.text
var message = ["cmd":"msg","content":content]
self.sendMesage(message)
textView.text = nil
}
func processSocket() {
var alert = UIAlertController(title: "New name",
message: "Add a new name",
preferredStyle: .Alert)
self.clientSocket = TCPClient(addr: self.serverIP,port: 120)
self.doInBackground({
var (success,msg) = self.clientSocket!.connect(timeout: 5)
func readmsg()->NSDictionary? {
if let data=self.clientSocket!.read(4){
if data.count == 4{
var ndata = NSData(bytes: data, length: data.count)
var len:Int32 = 0
ndata.getBytes(&len, length: data.count)
if let buff=self.clientSocket!.read(Int(len)){
var msgd:NSData=NSData(bytes: buff, length: buff.count)
var msgi:NSDictionary=NSJSONSerialization.JSONObjectWithData(msgd, options: .MutableContainers, error: nil) as NSDictionary
return msgi
}
}
}
return nil
}
if success{
dispatch_async(dispatch_get_main_queue(), {
self.alert = UIAlertController(title: "connection success", message: nil, preferredStyle: .Alert )
})
var msgtosend = ["login":"nickname","nickname":self.nickName]
self.sendMesage(msgtosend)
while true {
if let msg=readmsg() {
dispatch_async(dispatch_get_main_queue(), {
self.proccessMessage(msg)
})
}else {
dispatch_async(dispatch_get_main_queue(), {
self.disconnect()
})
break
}
}
}else {
dispatch_async(dispatch_get_main_queue(), {
self.alert = UIAlertController(title: msg, message: msg, preferredStyle: .Alert)
})
}
})
}
var dateFormatter = NSDateFormatter()
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func formatDate(date: NSDate) ->String {
let calender = NSCalendar.currentCalendar()
let last18Hours = (-18*60*60 < date.timeIntervalSinceNow)
if last18Hours {
dateFormatter.dateStyle = .NoStyle
dateFormatter.timeStyle = .ShortStyle
}else {
dateFormatter.dateStyle = .ShortStyle
dateFormatter.timeStyle = .NoStyle
}
return dateFormatter.stringFromDate(date)
}
func configureWithMessage(message: Message){
messageLabel.text = message.text
nameLabel.text = message.from
timeLabel.text = self.formatDate(message.sentDate)
}
func keyboardWillShow(n:NSNotification){
let userInfo = n.userInfo as NSDictionary!
let frameNew = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
let insetNewBottom = messageTableView!.convertRect(frameNew, fromView: nil).height
let insetOld = messageTableView!.contentInset
let insetChange = insetNewBottom - insetOld.bottom
let overflow = messageTableView!.contentSize.height - (messageTableView!.frame.height-insetOld.top-insetOld.bottom)
let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as NSNumber).doubleValue
let animations: (() -> Void) = {
if !(self.messageTableView!.tracking || self.messageTableView!.decelerating) {
// Move content with keyboard
if overflow > 0 { // scrollable before
self.messageTableView!.contentOffset.y += insetChange
if self.messageTableView!.contentOffset.y < -insetOld.top {
self.messageTableView!.contentOffset.y = -insetOld.top
}
} else if insetChange > -overflow { // scrollable after
self.messageTableView!.contentOffset.y += insetChange + overflow
}
}
}
if duration > 0 {
let options = UIViewAnimationOptions(UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).integerValue << 16))
UIView.animateWithDuration(duration, delay: 0, options: options, animations: animations, completion: nil)
} else {
animations()
}
}
func keyboardDidShow(notification: NSNotification) {
let userInfo = notification.userInfo as NSDictionary!
let frameNew = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
let insetNewBottom = messageTableView!.convertRect(frameNew, fromView: nil).height
// Inset `tableView` with keyboard
let contentOffsetY = messageTableView!.contentOffset.y
messageTableView!.contentInset.bottom = insetNewBottom
messageTableView!.scrollIndicatorInsets.bottom = insetNewBottom
// Prevents jump after keyboard dismissal
if self.messageTableView!.tracking || self.messageTableView!.decelerating {
messageTableView!.contentOffset.y = contentOffsetY
}
}
func keyboardWillHide(n:NSNotification){
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return messages.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
var cell:UITableViewCell=tableView.dequeueReusableCellWithIdentifier("MessageCell") as UITableViewCell
var msg=self.messages[indexPath.row]
//cell.configureWithMessage(msg)
return cell
}
}
messageTableView.dataSource = self
错误消息=致命错误:在解包可选值时意外发现nil
答案 0 :(得分:2)
删除messageTableView.dataSource = self
然后从故事板
转到tableView的Connections Inspectors之后将dataSource拖到viewController
我希望这可以帮到你