gpt4 book ai didi

swift - 在选项卡栏 View Controller 内执行操作后应用程序崩溃

转载 作者:行者123 更新时间:2023-11-30 13:15:39 24 4
gpt4 key购买 nike

我有一个带有标签栏 Controller 的应用程序。在一个选项卡内有一个导航 Controller ,其中有一个 ViewController。现在这个 View 包含一个消息传递界面,我的问题是,随着标签栏的添加, View 底部的文本框被切断。为了解决这个问题,我做了一些研究并简单地添加了一行:

self.edgesForExtendedLayout = .None

解决了这个问题。我的文本框正在显示,用户可以选择它并修改它等。但是,当用户点击发送时,我的应用程序崩溃并显示消息:

fatal error :在解包可选值时意外发现 nil

我不知道问题是什么,因为在那之前一切都运行良好......

我的 ViewController 的完整代码如下:

    class ChatViewController: JSQMessagesViewController, CLLocationManagerDelegate {

// MARK: Properties

//Location
var city: String = ""
var state: String = ""
var country: String = ""
var locationManager = CLLocationManager()
var locationId: String = ""

func getLocation() -> String {
if city == ("") && state == ("") && country == (""){
return "Anonymous"
}
else {
if country == ("United States") {
return self.city + ", " + self.state
}
else {
return self.city + ", " + self.state + ", " + self.country
}
}
}

//Firebase
var rootRef = FIRDatabase.database().reference()
var messageRef: FIRDatabaseReference!
var locationRef: FIRDatabaseReference!

//JSQMessages
var messages = [JSQMessage]()

var outgoingBubbleImageView: JSQMessagesBubbleImage!
var incomingBubbleImageView: JSQMessagesBubbleImage!



override func viewDidLoad() {
super.viewDidLoad()

self.edgesForExtendedLayout = .None

locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()

if CLLocationManager.locationServicesEnabled() {
//collect user's location
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
locationManager.requestLocation()
locationManager.startUpdatingLocation()
}

title = "Group Chat"
setupBubbles()
// No avatars
collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSizeZero
collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero

// Remove file upload icon
self.inputToolbar.contentView.leftBarButtonItem = nil;

messageRef = rootRef.child("messages")
locationRef = rootRef.child("locations")
}

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
observeMessages()
}

override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
}


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//--- CLGeocode to get address of current location ---//
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

if let pm = placemarks?.first
{
self.displayLocationInfo(pm)
}

})

}


func displayLocationInfo(placemark: CLPlacemark?)
{
if let containsPlacemark = placemark
{
//stop updating location
locationManager.stopUpdatingLocation()

self.city = (containsPlacemark.locality != nil) ? containsPlacemark.locality! : ""
self.state = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea! : ""
self.country = (containsPlacemark.country != nil) ? containsPlacemark.country! : ""

print(getLocation())

}

}


func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error while updating location " + error.localizedDescription)
}


override func collectionView(collectionView: JSQMessagesCollectionView!,
messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! {
return messages[indexPath.item]
}

override func collectionView(collectionView: JSQMessagesCollectionView!,
messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! {
let message = messages[indexPath.item] // 1
if message.senderId == senderId { // 2
return outgoingBubbleImageView
} else {
return incomingBubbleImageView
}
}

override func collectionView(collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return messages.count
}

override func collectionView(collectionView: JSQMessagesCollectionView!,
avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! {
return nil
}

private func setupBubbles() {
let factory = JSQMessagesBubbleImageFactory()
outgoingBubbleImageView = factory.outgoingMessagesBubbleImageWithColor(
UIColor.jsq_messageBubbleBlueColor())
incomingBubbleImageView = factory.incomingMessagesBubbleImageWithColor(
UIColor.jsq_messageBubbleLightGrayColor())
}

func addMessage(id: String, text: String) {
let message = JSQMessage(senderId: id, displayName: "", text: text)

messages.append(message)
}

override func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath)
as! JSQMessagesCollectionViewCell

let message = messages[indexPath.item]

if message.senderId == senderId {
cell.textView!.textColor = UIColor.whiteColor()
} else {
cell.textView!.textColor = UIColor.blackColor()
}

return cell
}

override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!,
senderDisplayName: String!, date: NSDate!) {

let itemRef = messageRef.childByAutoId()
let messageItem = [
"text": text,
"senderId": senderId
]
itemRef.setValue(messageItem)

let locRef = locationRef.childByAutoId()
let locItem = [
senderId : [
"location": getLocation()
]
]

locRef.setValue(locItem)

// Retrieve data from Firebase Realtime database

FIRDatabase.database().reference().child("locations").child(senderId).child("location").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
self.locationId = snapshot.value!["location"] as! String
}) { (error) in
print(error.localizedDescription)
}


JSQSystemSoundPlayer.jsq_playMessageSentSound()

finishSendingMessage()

}

private func observeMessages() {

let messagesQuery = messageRef.queryLimitedToLast(25)

messagesQuery.observeEventType(.ChildAdded) { (snapshot: FIRDataSnapshot!) in

let id = snapshot.value!["senderId"] as! String
let text = snapshot.value!["text"] as! String

self.addMessage(id, text: text)

self.finishReceivingMessage()
}
}


override func textViewDidChange(textView: UITextView) {
super.textViewDidChange(textView)
}


override func collectionView(collectionView: JSQMessagesCollectionView!, attributedTextForCellBottomLabelAtIndexPath indexPath: NSIndexPath!) -> NSAttributedString! {

let message = messages[indexPath.item]

// Call data I have retrieved below with message
let text = "From: " + locationId

if message.senderId == senderId {
return nil
} else {
return NSAttributedString(string: text)
}

}

override func collectionView(collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForCellBottomLabelAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return kJSQMessagesCollectionViewCellLabelHeightDefault
}


}

感谢您提前提供的任何帮助!

最佳答案

用户点击发送按钮后出现问题。我刚刚将 self.edgesForExtendedLayout = .None 行添加到特定操作中,效果很好!

关于swift - 在选项卡栏 View Controller 内执行操作后应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38262725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com