我有一個頁面顯示來自數據庫的消息。消息正在被加載,因爲它應該,但是當我嘗試重新加載它顯示新的消息,間隔一分鐘後,我得到的消息超出範圍。由於某種原因,它看起來像數組是空的。我已經閱讀了很多解決方案,但其中沒有解釋我的代碼中發生了什麼。間隔快速讀取數組顯示索引超出範圍
這是完整的代碼。
import UIKit
import Foundation
class LeftSideViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var answerPMTapped: UIButton!
@IBOutlet weak var senderProfileImage: UIImageView!
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var BodyMessage: UITextView!
@IBOutlet weak var TitleMessage: UILabel!
@IBOutlet weak var totalKm: UILabel!
@IBOutlet weak var ranking: UILabel!
@IBOutlet weak var totalCollected: UILabel!
@IBOutlet weak var profileName: UILabel!
@IBOutlet weak var euroSign: UILabel!
var MessageId = [String]()
var MessageSender = [String]()
var MessageReceiver = [String]()
var MessageBody = [String]()
var MessageTime = [String]()
var MessageDate = [String]()
var MessageStatus = [String]()
var MessageTitle = [String]()
var SenderUsername = [String]()
var ReplyMessageId = [String]()
var T_message_Title:String!
var menuItems:[String] = ["Home","Profiel", "Goede Doelen", "Berichten", "Verstuur bericht", "Instellingen","Uitloggen"];
var menuImage: [String] = ["home", "profile", "charity", "message", "reply", "settings", "logout"]
var urlString = String()
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBarHidden = true
load_message()
}
override func viewDidLoad() {
super.viewDidLoad()
get_user_data()
get_my_message_list()
/* if (TitleMessage != nil){
var title_convert = MessageTitle[1]
var message_convert = MessageBody[1]
TitleMessage.text = title_convert
BodyMessage.text = message_convert
} else {
BodyMessage.text = "Er zijn geen berichten op dit moment."
} */
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var userEmail = prefs.valueForKey("USERNAME") as! String
let newUsername = userEmail.stringByReplacingOccurrencesOfString(".", withString: "")
let NewUserName = newUsername.stringByReplacingOccurrencesOfString("@", withString: "")
let imgString = NewUserName
var urlString = "xxxxxxxx/profile/image/\(imgString).jpg"
euroSign.hidden = true
if (totalCollected != nil) {
euroSign.hidden = false
}
self.profileImageView.layer.cornerRadius = self.profileImageView.frame.size.width/2;
self.profileImageView.clipsToBounds = true;
load_profile_image(urlString)
var reload_messages = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("message_Reloader"), userInfo: nil, repeats: true)
}
func message_Reloader(){
self.MessageId.removeAll()
self.MessageSender.removeAll()
self.MessageReceiver.removeAll()
self.MessageBody.removeAll()
self.MessageTime.removeAll()
self.MessageDate.removeAll()
self.MessageStatus.removeAll()
self.MessageTitle.removeAll()
self.SenderUsername.removeAll()
self.ReplyMessageId.removeAll()
get_my_message_list()
load_message()
}
func load_profile_image(urlString: String){
var imgURL: NSURL = NSURL(string: urlString)!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!,error: NSError!) -> Void in
if error == nil {
self.profileImageView.image = UIImage(data: data)
println(imgURL)
}
})
}
func get_user_data(){
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var userEmail = prefs.valueForKey("USERNAME") as! String
let url = NSURL(string:"xxxxxx/fetch-user-profile.php")
let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
var request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 2.0)
request.HTTPMethod = "POST"
// set Content-Type in HTTP header
let boundaryConstant = "----------V2ymHFg03esomerandomstuffhbqgZCaKO6jy";
let contentType = "multipart/form-data; boundary=" + boundaryConstant
NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request)
// set data
var dataString = "username=\(userEmail)"
let requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = requestBodyData
// set content length
//NSURLProtocol.setProperty(requestBodyData.length, forKey: "Content-Length", inRequest: request)
var response: NSURLResponse? = nil
var error: NSError? = nil
let dataReply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error)
if(dataReply != nil){
let res = response as! NSHTTPURLResponse!;
NSLog("Response code: %ld", res.statusCode);
if (res.statusCode >= 200 && res.statusCode < 300)
{
var results = NSJSONSerialization.JSONObjectWithData(dataReply!, options: nil, error: &error) as! NSDictionary
NSLog("PostData: %@",dataReply!);
NSLog("ResultData: %@",results);
var jsonOutput = JSON(data: dataReply!)
totalKm.text = jsonOutput["total_km"].stringValue
totalCollected.text = jsonOutput["collected"].stringValue
ranking.text = jsonOutput["rank"].stringValue
profileName.text = jsonOutput["username"].stringValue
} else {
println("Fetching data failed.")
}
} else {
println("Fetching data failed.")
}
}
func load_message(){
println("\(MessageBody[0])")
var messagebody = MessageBody[0]
var messagetitle = MessageTitle[0]
var messagesender = MessageSender[0]
let newUsername = messagesender.stringByReplacingOccurrencesOfString(".", withString: "")
let NewUserName = newUsername.stringByReplacingOccurrencesOfString("@", withString: "")
let imgString = NewUserName
var urlString = "xxxxxxxxx/profile/image/\(imgString).jpg"
self.senderProfileImage.layer.cornerRadius = self.senderProfileImage.frame.size.width/2;
self.senderProfileImage.clipsToBounds = true;
var imgURL: NSURL = NSURL(string: urlString)!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!,error: NSError!) -> Void in
if error == nil {
self.senderProfileImage.image = UIImage(data: data)
println(imgURL)
}
})
if (messagetitle.isEmpty){
BodyMessage.text = "Er zijn geen berichten op dit moment."
}
else {
TitleMessage.text = messagetitle
BodyMessage.text = messagebody
}
}
@IBAction func answerPM(sender: AnyObject) {
var messageid = MessageId[0]
var messagesender = MessageSender[0]
var messagereceiver = MessageReceiver[0]
var senderusername = SenderUsername[0]
var replymessageid = ReplyMessageId[0]
// send over the orignal message so we can use that info to show the message again when they click the back button
var messagedate = MessageDate[0]
var messagebody = MessageBody[0]
var messagetitle = MessageTitle[0]
var messagetime = MessageTime[0]
var messagesendeR = MessageSender[0]
var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView
centerViewController.MessageId2 = messageid
centerViewController.MessageSender2 = messagesender
centerViewController.MessageReceiver2 = messagereceiver
centerViewController.SenderUsername2 = senderusername
centerViewController.ReplyMessageId2 = replymessageid
println("sender username: \(senderusername) reply message id: \(replymessageid)")
centerViewController.A_messagedate = messagedate
centerViewController.A_messagebody = messagebody
centerViewController.A_messagetitle = messagetitle
centerViewController.A_messagetime = messagetime
centerViewController.A_messagesendeR = messagesendeR
var centerNavController = UINavigationController(rootViewController: centerViewController)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = centerNavController
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
}
@IBAction func viewAllMessages(sender: AnyObject) {
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("messagesList") as! MessagesView
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
}
@IBAction func markMGSRead(sender: AnyObject) {
}
func get_my_message_list(){
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var receiverEmail = prefs.valueForKey("USERNAME") as! String
println("userEmail: \(receiverEmail)")
let request = NSMutableURLRequest(URL: NSURL(string: "xxxxxxxxxx/user/fetchmymessages.php")!)
//let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
request.HTTPMethod = "POST"
var postData = "receiveremail=\(receiverEmail)"
request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)
NSLog("data: \(request)")
var task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, innerError) in
NSLog("response: \(response)")
let json = JSON(data: data)
if json != nil {
let mysocialArray = json.arrayValue
NSLog("\(json)")
dispatch_async(dispatch_get_main_queue(), {
for mysociallist in mysocialArray
{
let messageId = mysociallist["message_id"].stringValue
let sender = mysociallist["sender"].stringValue
let receiver = mysociallist["receiver"].stringValue
let messageBody = mysociallist["message"].stringValue
let time = mysociallist["time"].stringValue
let date = mysociallist["date"].stringValue
let messageStatus = mysociallist["message_read"].stringValue
let messagesubject = mysociallist["message_title"].stringValue
let senderusername = mysociallist["sender_username"].stringValue
let replymessageid = mysociallist["reply_message_id"].stringValue
println("message id: \(messageId)")
println("message sender: \(sender)")
self.MessageId.append(messageId)
self.MessageSender.append(sender)
self.MessageReceiver.append(receiver)
self.MessageBody.append(messageBody)
self.MessageTime.append(time)
self.MessageDate.append(date)
self.MessageStatus.append(messageStatus)
self.MessageTitle.append(messagesubject)
self.SenderUsername.append(senderusername)
self.ReplyMessageId.append(replymessageid)
}
})
}else {
var alertView:UIAlertView = UIAlertView()
alertView.title = "Berichten ophalen mislukt"
alertView.message = "Er is een fout opgetreden, daardoor kunnen de berichten niet tonen."
alertView.delegate = self
alertView.addButtonWithTitle("OK")
alertView.show()
}
}
task.resume()
}// end of get my message list
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return menuItems.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var mycell = tableView.dequeueReusableCellWithIdentifier("MyCell") as! MyCustomTableViewCell
mycell.menuItemLabel?.text = menuItems[indexPath.row]
mycell.menuItemImage?.image = UIImage(named: menuImage[indexPath.row])
return mycell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
switch(indexPath.row)
{
case 0:
var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("memberArea") as! userOverview
var centerNavController = UINavigationController(rootViewController: centerViewController)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = centerNavController
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 1:
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("userProfile") as! userProfile
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 2:
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("userProfile") as! userProfile
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 3:
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("messagesList") as! MessagesView
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 4:
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 5:
var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView
var userProfileNav = UINavigationController(rootViewController: userProfiles)
var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.centerContainer!.centerViewController = userProfileNav
appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil)
break;
case 6:
let appDomain = NSBundle.mainBundle().bundleIdentifier
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!)
self.performSegueWithIdentifier("loggin_out", sender: self)
break;
default:
println("\(menuItems[indexPath.row]) is selected");
}
}
}
這是完整的代碼,但就是給人錯誤以下被稱爲當部分,
override func viewDidLoad() {
super.viewDidLoad()
var reload_messages = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("message_Reloader"), userInfo: nil, repeats: true)
}
func message_Reloader(){
self.MessageId.removeAll()
self.MessageSender.removeAll()
self.MessageReceiver.removeAll()
self.MessageBody.removeAll()
self.MessageTime.removeAll()
self.MessageDate.removeAll()
self.MessageStatus.removeAll()
self.MessageTitle.removeAll()
self.SenderUsername.removeAll()
self.ReplyMessageId.removeAll()
get_my_message_list()
load_message()
}
我已經離開了viewDidLoad中的一小部分,使其不會太長。
我不是一個專業人士,所以我真的可以在這裏使用一些幫助來弄清楚如何調用該函數並將其存儲在數組中,以便我可以顯示新消息。
希望有人能給我一些代碼示例,或者可以將我指向正確的方向,我真的被困在這裏,它不斷崩潰我的應用程序。
感謝
您應該嘗試在您的問題中顯示[MCVE](http://stackoverflow.com/help/mcve)而不是所有此代碼。 – Moritz