gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:43:50 25 4
gpt4 key购买 nike

我有一个 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/

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