- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!