Toolbar item not work when opening NSWindowController programmatically

43 views Asked by At

I have connected My SearchField toolbar item by subclassing NSWindowController. And make action to call delegate in ViewController by creating delegate in subclass of NSWindowController. Now, when I open new tab from SourceList sidebar as Sidebar in SplitViewController, the search isn't work in new tab, but work in first tab.

My toolbar search item not work when open the InitialView in storyboard with programmaticaly code. like this:

    func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
        if !flag {
            if let reopenWindow = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
                .instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("MainWindowController")) as? WindowController {
                reopenWindow.showWindow(nil)
            }
        }
        return true
    }

I have to make name of IBAction in class WindowController to match the name action in subclass of NSViewController to make it receive action. like this:

 @IBAction func addSiswa(_ sender: NSToolbarItem) {
        // Pastikan self.contentViewController tidak nil dan merupakan instance dari SplitVC
        if let splitViewController = self.contentViewController as? SplitVC {
            
            
            // Pergi melalui setiap split view item dan temukan view controller yang sesuai
            for splitViewItem in splitViewController.splitViewItems {
                if let kelasVC = splitViewItem.viewController as? KelasVC {
                    kelasVC.addSiswa(sender)
                    return
                } else if let siswaViewController = splitViewItem.viewController as? SiswaViewController {
                    siswaViewController.addSiswa(sender)
                    return
                } else if let transaksiView = splitViewItem.viewController as? TransaksiView {
                    transaksiView.addSiswa(sender)
                    return
                }
            }
        }
    @IBOutlet var searchField: NSSearchField!
    @IBOutlet weak var search: NSToolbarItem!
    @IBAction func procSearchFieldInput(sender: NSSearchField) {
        delegate?.search(sender.stringValue)
    }
// I add protocol to search in ViewController
 protocol WindowControllerDelegate: AnyObject {
    func search(_ searchText: String)
 }
class ViewController: {
    func search(_ searchText: String) {
        siswaData = dbController.searchSiswa(query: searchText)
        tableView.reloadData()
    }
}

class otherViewController: NSViewController {
func search(_ searchText: String) {
        switch activeTableType {
        case .kelas1:
            kelas1Model = dbController.searchKelas1Models(query: searchText)
            table1.reloadData()
        case .kelas2:
            kelas2Model = dbController.searchKelas2Models(query: searchText)
            table2.reloadData()
        case .kelas3:
            kelas3Model = dbController.searchKelas3Models(query: searchText)
            table3.reloadData()
        case .kelas4:
            kelas4Model = dbController.searchKelas4Models(query: searchText)
            table4.reloadData()
        case .kelas5:
            kelas5Model = dbController.searchKelas5Models(query: searchText)
            table5.reloadData()
        case .kelas6:
            kelas6Model = dbController.searchKelas6Models(query: searchText)
            table6.reloadData()
        }
    }
}
@objc func openNewTab(_ sender: Any) {
        guard let outlineView = outlineView else {
            return
        }

        let clickedRow = outlineView.clickedRow

        guard clickedRow >= 0 && clickedRow < outlineView.numberOfRows else {
            return
        }

        guard let selectedItem = outlineView.item(atRow: clickedRow) as? SidebarItem else {
            return
        }
        
        guard let indexToOpen = indexToOpenForSidebarItem(selectedItem) else {
            return
        }
        let newWindowController = self.storyboard!.instantiateInitialController() as! WindowController
        
        // Menambahkan window sebagai tab baru
        let window = newWindowController.window!
                
        // Menambahkan window sebagai tab baru
        self.view.window!.addTabbedWindow(window, ordered: .above)
        window.windowController = newWindowController
        window.makeKeyAndOrderFront(self)

        if let splitVC = window.contentViewController as? SplitVC {
            splitVC.didSelectSidebarItem(index: indexToOpen)
            splitVC.delegate = splitVC.self
        }
    }

I have change my @IBAction func searh in subclass of NSWindowController like this, But not work in new tab.

@IBAction func search(_ sender: NSSearchField) {
        if let splitViewController = self.contentViewController as? SplitVC {
            for splitViewItem in splitViewController.splitViewItems {
                if let siswaViewController = splitViewItem.viewController as? SiswaViewController {
                    siswaViewController.search(sender.stringValue)
                } else if let guruViewController = splitViewItem.viewController as? GuruViewController {
                    guruViewController.search(sender.stringValue)
                } else if let kelasVC = splitViewItem.viewController as? KelasVC {
                    kelasVC.search(sender.stringValue)
                }
            }
        }
    }
0

There are 0 answers