有没有办法从RegionManager取消注册区域?
使用
extension UINavigationController {
func fhkFindFirst<T: UIViewController>(_: T.Type) -> T? {
for viewController in viewControllers {
if let supClassType = viewController.superclass?.dynamicType where supClassType != T.Type.self {
if let viewController = viewController as? T {
return viewController
}
}
}
return nil
}
}
class FooBarViewController: UIViewController { }
class FooViewController : FooBarViewController { }
class BarViewController : FooBarViewController { }
let fooBarViewController = FooBarViewController()
let fooViewController = FooViewController()
let barViewController = BarViewController()
let navController = UINavigationController(rootViewController: fooViewController)
navController.addChildViewController(barViewController)
navController.addChildViewController(fooBarViewController)
print(navController.fhkFindFirst(FooViewController) ?? "None found.")
/* <__lldb_expr_1582.FooViewController: 0x7fe22a712e40> */
print(navController.fhkFindFirst(BarViewController) ?? "None found.")
/* <__lldb_expr_1582.BarViewController: 0x7fe22a4196a0> */
print(navController.fhkFindFirst(FooBarViewController) ?? "None found.")
/* <__lldb_expr_1582.FooBarViewController: 0x7fe22a70ee60> */
我在RegionManager注册一个区域。
但是,如果我需要删除该注册(为了再次注册完全相同的区域),该怎么办?
===================
这是我的情况:
我有一个实例RegionManager.SetRegionName(myRegion, regionName);
RegionManager.SetRegionManager(myRegion, myRegionManager);
,它使用以下命令将UI控件(DependencyObject)myView
注册为区域:
myRegion
实例化RegionManager.SetRegionName(myRegion, regionName);
RegionManager.SetRegionManager(myRegion, myRegionManager);
时,也会实例化本地区域管理器对象myView
。
然后我需要再次创建实例myRegionManager
,再次进行此注册。
因此,新实例myView
也会实例化一个新的本地区域管理器myView
,当然没有与之关联的区域。
然后,对myRegionManager
和RegionManager.SetRegionName(...)
的调用成功,但如果我尝试使用
RegionManager.SetRegionManager(...)
myRegionManager
我收到了IRegion region = myRegionManager.Regions[regionName];
!
如果我放置
RegionUpdateException
在注册前,string name = RegionManager.GetRegionName(myRegion);
IRegionManager regionManager = RegionManager.GetRegionManager(myRegion);
的第一个实例化时两个字段都是空的,但在myView
的第二个实例化期间它们确实有值。
但由于myView
和myRegion
都与myRegionManager
一起新实例化,我希望在调用第二次注册之前,名称和区域管理器也是空的。
答案 0 :(得分:0)
您可以使用RegionManager
&#39; s Regions
- 属性按名称删除该区域:
public interface IRegionManager
{
/// <summary>
/// Gets a collection of <see cref="IRegion"/> that identify each region by name. You can use this collection to add or remove regions to the current region manager.
/// </summary>
IRegionCollection Regions { get; }
[...]
}
和
public interface IRegionCollection : IEnumerable<IRegion>, INotifyCollectionChanged
{
[...]
/// <summary>
/// Removes a <see cref="IRegion"/> from the collection.
/// </summary>
/// <param name="regionName">Name of the region to be removed.</param>
/// <returns><see langword="true"/> if the region was removed from the collection, otherwise <see langword="false"/>.</returns>
bool Remove(string regionName);
[...]
}
答案 1 :(得分:0)
根据您的描述,听起来您需要拥有相同View的多个实例,其中定义了一个区域,并且能够在这些相应区域内注入其他视图。这是对的吗?
查看有关ScopedRegions的文档:https://github.com/PrismLibrary/Prism/blob/master/Documentation/WPF/50-ComposingtheUserInterface.md#creating-multiple-instances-of-a-region
您还可以观看此Pluralsight课程,该课程向您展示如何使用ScopedRegions:https://app.pluralsight.com/library/courses/prism-showing-multiple-shells/table-of-contents