gpt4 book ai didi

arrays - 将 NSTableView 中显示的数组行传递到 Swift 中的另一个数组

转载 作者:行者123 更新时间:2023-11-30 12:41:54 26 4
gpt4 key购买 nike

我有2个数组

var messages = [Message]()
var screenMessages = [screenMessage]()

我在 NSTableView 中有消息数组项目。当我按下 IBOutlet 时,我想将该行中的项目传递到 screenMessages 数组以显示在另一个 NSTableView 中。

我的 NSTableView 像这样开始..

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeViewWithIdentifier("cell", owner: self) as? secondviewTableCell

let mess = messages[row]

我尝试了多种在 screenMessages 中附加 messages[row] 的方法,但我无法确定它。如果有人能够向我展示或指出正确的方向,那就太好了。

谢谢。

添加了更多详细信息:

屏幕一看起来像这样,当按下添加按钮时,它应该将该数据从该行传递到屏幕二的表格 View 中..

enter image description here

屏幕二:

enter image description here

我的第一屏 View 如下:

import Firebase
import Cocoa


var messages = [Message]()
var screenMessages = [screenMessage]()
class secondVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource {


@IBOutlet weak var tableView: NSTableView!
@IBOutlet weak var screenRefreshBtn: NSButton!
@IBOutlet weak var refreshButton: NSButton!



var senderImageUrl: String!
var ref: Firebase!
var messagesRef: Firebase!

func setupFirebase() {

messagesRef = Firebase(url: "https://url.firebaseio.com/screenmessages")

messagesRef.queryLimitedToLast(25).observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in
let text = snapshot.value["text"] as? String
let sender = snapshot.value["senderName"] as? String
let imageUrl = snapshot.value["profileImageURL"] as? String
let MediaType = snapshot.value["MediaType"] as! String
let fileUrl = snapshot.value["fileUrl"] as? String

let message = Message(text: text, sender: sender, imageUrl: imageUrl, MediaType: MediaType, fileUrl: fileUrl)
messages.append(message)

let screenmessage = screenMessage(text: text, sender: sender, imageUrl: imageUrl, MediaType: MediaType, fileUrl: fileUrl)
screenMessages.append(screenmessage)


switch MediaType{
case "TEXT":

print("text message")

case "PHOTO":
print("photo message")



default:
print("default")
}

self.tableView.reloadData()
})

}


override func viewDidLoad() {
super.viewDidLoad()

setupFirebase()


}

// MARK: - Table View

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return messages.count
}

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeViewWithIdentifier("cell", owner: self) as? secondviewTableCell

let mess = messages[row]
if mess.text() == nil {
result?.textField?.alphaValue = 0
result!.sendertextView.stringValue = mess.sender()


let url = NSURL(string: mess.fileUrl()!)!

// Download task:
// - sharedSession = global NSURLCache, NSHTTPCookieStorage and NSURLCredentialStorage objects.
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in
// if responseData is not null...
if let data = responseData{

// execute in UI thread
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let photo = NSImage(data: data)!

result?.mediaPhoto.image = photo

})
}
}
task.resume()

} else {


result!.textField!.stringValue = mess.text()!
result!.sendertextView.stringValue = mess.sender()
}

return result


}





@IBAction func addtablerow(object: NSButton) {

let row = tableView.rowForView( object as NSView )
if ( row > -1 ) {


}
}

我的第二个屏幕是:

import Cocoa

class screenVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

var addedObserver = false

@IBOutlet weak var tableView: NSTableView!


override func viewDidLoad() {
super.viewDidLoad()

refreshObs()
clearObs()
self.tableView.backgroundColor = NSColor.clearColor()
if let window = self.view.window {
// custom window here
window.level = Int(CGWindowLevelForKey(.FloatingWindowLevelKey))

} else {
addedObserver = true
self.addObserver(self, forKeyPath: "view.window", options: [.New, .Initial], context: nil)

}



}

func refreshList(notification: NSNotification){
self.tableView.alphaValue = 0
dispatch_async(dispatch_get_main_queue(), {

self.tableView.reloadData()

})

animateViewRefresh()
tableView.scrollToEndOfDocument(self)
}

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return screenMessages.count
}


func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeViewWithIdentifier("cell2", owner: self) as? screenviewTableCell

let mess = screenMessages[row]
result?.senderLabel.stringValue = mess.sender()
if mess.text() != nil {
result?.messageTextView.stringValue = mess.text()!
let url = NSURL(string: mess.imageUrl()!)!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in

if let data = responseData{


dispatch_async(dispatch_get_main_queue(), { () -> Void in
result?.avatarImage.image = NSImage(data: data)
})

}}

task.resume()

} else {
result?.messageTextView.alphaValue = 0

let mess = screenMessages[row]
let url = NSURL(string: mess.fileUrl()!)!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in

if let data = responseData{
dispatch_async(dispatch_get_main_queue(), { () -> Void in

let photo = NSImage(data: data)!

result?.mediaPhoto.image = photo

})
}
}

let url2 = NSURL(string: mess.imageUrl()!)!

let task2 = NSURLSession.sharedSession().dataTaskWithURL(url2) { (responseData, responseUrl, error) -> Void in

if let data = responseData{

dispatch_async(dispatch_get_main_queue(), { () -> Void in
result?.avatarImage.image = NSImage(data: data)

})

}}
task.resume()
task2.resume()




}

return result


}

// MARK : Animate

func animateView(notification: NSNotification){
NSAnimationContext.runAnimationGroup({ (context) in
context.duration = 2
self.tableView.animator().alphaValue = 0
screenMessages.removeAll()
}, completionHandler: { () -> Void in



})}

func animateViewRefresh(){


NSAnimationContext.runAnimationGroup({ (context) in
context.duration = 4


self.tableView.animator().alphaValue = 1

}, completionHandler: { () -> Void in



})}

func refreshObs(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(screenVC.refreshList(_:)), name:"refreshMyTableView", object: nil)


}

func clearObs(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(screenVC.animateView(_:)), name:"clearMyTableView", object: nil)

}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if let window = self.view.window {
// custom window here
window.level = Int(CGWindowLevelForKey(.FloatingWindowLevelKey))
window.titlebarAppearsTransparent = true
window.movableByWindowBackground = true
window.opaque = true
window.backgroundColor = NSColor.clearColor()


}
}

deinit {
if addedObserver {
self.removeObserver(self, forKeyPath: "view.window")
}
}



}

我尝试了很多方法,例如“screenMessages += messages(row)”并附加将该行添加到 screenMessages 数组中,但我没有运气。

我是否以正确的方式处理这个问题,或者有更好的方法吗?

谢谢。

最佳答案

要将一个元素从一个数组附加到另​​一个数组,只需编写

let index = index of element you need
let message = messages[index]
screenMessages.append(message)

如果消息的类型与 screenMessages 数组的内容不同,您需要对其进行转换,我需要更多类型的详细信息来帮助解决此问题。

如果您在将数据传递到另一个 ViewController 时遇到问题,我需要有关当前架构的更多信息来提供好的建议,但例如您可以定义一个协议(protocol) MessageDelegate,其中一个 Controller 实现而另一个 Controller 将其作为属性.

更新

如果您更新表的数据数组并希望显示新信息,请记住在 UITableView 上调用 reloadData

关于arrays - 将 NSTableView 中显示的数组行传递到 Swift 中的另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42133071/

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