ios - 如何在 UISplitViewController 中分配 MasterViewController 的子菜单的委托(delegate)

标签 ios swift delegates uisplitviewcontroller

我有一个 DetailViewController,它是一个子菜单的委托(delegate),在应用程序启动开始时尚未推送。这里我想知道将 delegate 属性分配给 ViewController 的最佳位置在哪里。

这就是我在 AppDelegates.swift 中所做的

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        dataController = DataController()

        let splitViewController = self.window!.rootViewController as! UISplitViewController
        splitViewController.delegate = self

        let detailNavigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
        detailNavigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
        let mainVC = detailNavigationController.topViewController as! MainViewController
        mainVC.dataController = dataController

        let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController
        let mainMenuVC = masterNavigationController.topViewController as! MainMenuViewController
        mainMenuVC.dataController = dataController

        self.storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let nationsMenuVC = storyboard.instantiateViewControllerWithIdentifier("NationsMenuViewController") as! NationsMenuViewController
        nationsMenuVC.delegate = mainVC

        return true
    }

子菜单(NationsMenuVC)有这个:

protocol NationsMenuViewControllerDelegate: class {
    func nationSelected(nation: City?)
}

class NationsMenuViewController: UITableViewController {

    var nations:[City] = []
    var moc: NSManagedObjectContext!
    weak var delegate: NationsMenuViewControllerDelegate?

    override func viewDidLoad() {
.
.
.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedCity = self.nations[indexPath.row]
    self.delegate?.nationSelected(selectedCity)
    print("clicked at \(selectedCity.name)")
}

}

我确实在我的详细 View Controller (MainVC)中实现了委托(delegate)协议(protocol),但该函数没有触发。我想知道这是否是因为委托(delegate)属性在应用程序启动时被指定为弱,并且由于它还没有来自主菜单的任何引用(因为用户实际上尚未在主视图 Controller 级别单击它),因此委托(delegate)链接也许已经从内存中消失了?

在这种情况下,哪里是声明尚未加载的 View Controller 委托(delegate)的最佳位置?

extension MainViewController: NationsMenuViewControllerDelegate {
    func nationSelected(nation: City?) {
        if let selectedCity = nation {
            let coor:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: selectedCity.latitude!.doubleValue, longitude: selectedCity.longitude!.doubleValue)
            let span:MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 8.0, longitudeDelta: 8.0)
            let region:MKCoordinateRegion = MKCoordinateRegion(center: coor, span: span)
            self.mapView.setRegion(region, animated: true)
            print("selected \(selectedCity.name)")
        }

    }
}

最佳答案

很明显,您在应用程序中创建的nationMenuVC:didFinishLaunchingWithOptions:从未使用过,因此会立即被取消分配。您可以在 NationsMenuViewController 的 viewDidLoad 中设置委托(delegate)。您可能想知道如何访问 NationsMenuViewController 的 viewDidLoad 内的 mainVC。您可以在 AppDelegate 中创建一个函数来将其出售

 func  mainVC() -> MainViewController{

    let splitViewController = self.window!.rootViewController as! UISplitViewController


            let detailNavigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController

       let mainVC = detailNavigationController.topViewController as! MainViewController
      return mainVC

    }

现在您可以在 NationsMenuViewController 的 viewDidLoad 中调用它并设置委托(delegate):

self.delegate  = UIApplication.sharedApplication().delegate. mainVC()

HTH

关于ios - 如何在 UISplitViewController 中分配 MasterViewController 的子菜单的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35216609/

相关文章:

ios - WSO2 EMM iOS 注册错误 : "The Registration Authority' s response is invalid"

iphone - iOS:存档失败

swift - 为什么我的模型不在 View Controller 中显示其成员?

C++ - 如何将类上的所有成员函数调用委托(delegate)给同一接口(interface)的成员

c# - 对委托(delegate)声明事件的 XML 注释

IOS,解锁后唤醒应用程序(企业应用程序,受监管的 iPad)

ios - Storyboard不包含带有标识符的 View Controller

ios - UIViewController 多重继承

ios - 无法使用 CIFilter 从 CIImage 中提取 UIImage

c# - 如何将 Action 转换为具有相同签名的已定义委托(delegate)?