2017-02-09 1 views
0

У меня 2 массивыПередать массивы строку, показанную в NSTableView в другой массив в Swift

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 с сообщениями [строки], но я не могу положить палец на нем. Если бы кто-нибудь мог продемонстрировать или указать мне в правильном направлении, что было бы блестящим.

спасибо.

Добавлены более подробно:

экран один выглядит так и при нажатии на кнопке добавления она должна затем передать эти данные из этой строки в экране .. Tableview дополнительного кода

enter image description here

Экран два:

enter image description here

My 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 + = сообщения (строка)» и добавления, чтобы добавить эту строку в массив screenMessages, но я «Мне не повезло.

Я иду об этом в правильном направлении или есть лучший способ сделать это?

спасибо.

+0

Итак, вы хотите взять индекс из 'messages' массива и вставить его в тот же индекс массива 'screenMessages'? Если нет, можете ли вы дать дополнительные разъяснения? Ваш вопрос нечеткий. –

+0

Вы можете скопировать весь массив просто: let screenMessages = сообщения , но не уверены, что это то, что вы имеете в виду. – simonWasHere

+0

Я отредактировал свой вопрос, чтобы более четко понять, чего я пытаюсь достичь. - Я хочу передать 1 выбранные данные строк из NSTableView в другой NSTableView в другое окно. –

ответ

0

Чтобы добавить элемент из одного массива в другой массив просто написать

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

Если сообщение не тот же тип содержимого массива screenMessages вам нужно будет преобразовать его, мне нужно больше деталей типы, которые помогут с этим.

Если у вас возникли проблемы с передачей данных другому ViewController, мне нужна дополнительная информация о текущей архитектуре, чтобы дать полезные советы, но, например, вы можете определить протокол MessageDelegate, который реализует один из контроллеров, а другой - как имущество.

обновление

Если вы обновляете массив данных для таблицы и хотите новую информацию, чтобы появиться не забудьте позвонить reloadData на UITableView

+0

Я добавил свой код - я хочу, чтобы иметь возможность выбирать, какие строки из tableview отображаются во втором представлении таблицы, поэтому не копируйте весь массив, а только строку/s, которую я выбираю, нажав кнопку добавления IBOutlet. –

+0

Я обновил свой ответ, чтобы показать, как добавить элемент из одного массива в другой массив. Просто укажите индекс, который вы хотите перенести. – simonWasHere

+0

Это выглядит правильно .. Спасибо! Поэтому я пытаюсь получить индекс результата, обычно в iOS он будет таким же простым, как ItemAtIndexPath, но в OSX его ViewForTableColumn - я хочу получить массив сообщений по индексу правильно? –

Смежные вопросы