ios - UITableview 返回 nil

标签 ios uitableview swift

我有一个 Tableview,它返回 nil。我调用了 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

错误消息是= fatal error :在展开可选值时意外发现 nil

最佳答案

删除messageTableView.dataSource = self

然后从storyboard转到tableView的Connections Inspectors

之后将数据源拖到您的viewController

希望对你有帮助

关于ios - UITableview 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28317805/

相关文章:

swift - UITableViewController : Scrolling to bottom with dynamic row height starts animation at wrong position

arrays - 按 localizedCaseInsensitiveCompare 和默认 Comparable 对字符串数组进行排序有什么区别?

json - SwiftyJSON 返回 UNKNOWN 但 .exists() 返回 TRUE?

ios - Swift - AVFoundation 捕获图像方向

ios - iOS 会屏蔽所有应用程序图标还是仅屏蔽主屏幕上的应用程序图标?

ios - 响应 UIViewController 中的表格单元格操作

ios - UITableViewCell 作为来自 XIB 的 UIView

swift - 任何计算 SKEmitterNode 发射的粒子数量以启用坐标跟踪的方法

ios - 触发 IBAction 时更新用于创建 UITableView 的数组数据

ios - Xcode 7 beta 在自动完成时崩溃 - NSRangeException