将NSTableView中显示的数组行传递给Swift中的另一个数组

时间:2017-02-09 09:40:30

标签: arrays swift nstableview

我有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附加到消息[row]但我不能把手指放在上面。如果有人能证明或指出我正确的方向,那将是辉煌的。

谢谢。

添加了更多详细信息:

屏幕1看起来是这样的,当按下添加按钮时,它应该将该行中的数据传递到屏幕twos tableview ..

enter image description here

屏幕二:

enter image description here

我的第一屏视图如下:

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数组中,但我没有运气。

我是以正确的方式解决这个问题还是有更好的方法呢?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

如果您在将数据传递到另一个ViewController时遇到问题,我需要有关当前体系结构的更多信息以提供好的建议,但是例如,您可以定义一个控制器实现的协议MessageDelegate,另一个控制器具有属性作为属性

<强>更新

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