如何根据基本视图中的操作刷新其他视图控制器
How to refresh other view controllers based on a action from base view
在我的基本视图控制器上,我有一张地图,上面有用户的固定位置,然后将其存储到 NSUserdefaults
中。我还有一个删除选项,用户可以在其中删除 his/her 固定注释。该应用程序由选项卡控制器 运行 因此第一个选项卡是用户的固定位置,第二个选项卡是固定位置的详细视图。但是,当我从 first view controller
中删除注释时,旧位置仍然保留在 detailed view controller
。
有没有什么方法可以refresh/reload基于基础动作的细节视图控制器VC?
谢谢!
您可以使用 NSNotificationCenter
来实现。
基本上 NSNotificationCenter
保留对任何注册为观察者的对象的引用。通过该引用,它还可以跟踪对象需要什么样的通知。当对象发布通知时,中心通过向观察者发送带有该选择器的消息,将其传递给每个注册的观察者。
假设你有两个视图控制器
- 第一个视图控制器
- 第二个视图控制器
现在你想根据第二个视图中的某些操作在第一个视图控制器中执行一些操作 Controller.Then 在 FirstViewController 中你只需将此视图控制器注册为观察者并实现你想要处理的方法notification.From SecondViewController 你必须发送通知。
FirstViewController.m
在第一个视图控制器中,你必须像这样注册一个观察者。
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:@"reload_data" object:nil];
}
当您从 SecondViewController 收到一些通知时将调用此方法。
- (void)performAction {
NSLog(@"Do whatever you want to do");
}
SecondViewController.m
我从这里发送来自 SeconViewController 的通知。
- (IBAction)buttonClick:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"reload_data" object:self];
}
您可以为此使用 NSNotifications
。
在您的第一个视图控制器中,您实际上想要接收通知,而不是设置通知。
第二个视图控制器
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "resetData:", name: "reloadData", object: nil);
然后为您的选择器提供一个方法...
func resetData(notification:NSNotification) {
smallMapView.removeAnnotations(smallMapView.annotations);
smallMapView.showsUserLocation = true;
var location = locationManager.location;
var latitude = location.coordinate.latitude;
var longitude = location.coordinate.longitude;
var latDelta:CLLocationDegrees = 0.001;
var longDelta:CLLocationDegrees = 0.001;
var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta);
var overallLoc = CLLocationCoordinate2DMake(latitude, longitude);
var region:MKCoordinateRegion = MKCoordinateRegionMake(overallLoc, span);
self.smallMapView.setRegion(region, animated: true)
}
这将在用户当前位置的详细地图中重置图钉和中心(如果需要,您可以更改该功能)。
第一个视图控制器
我假设你在这里使用了 NSAlertView
...
@IBAction func trashButtonSelected(sender: AnyObject) {
// Remove from NSDefaults
// Show alertview
let alertController = UIAlertController(title: "Are you Sure?", message: "Do you wish to delete your pinned Location?", preferredStyle: .ActionSheet);
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (Action) in
// Cancel
}
let deleteButton = UIAlertAction(title: "Delete", style: .Destructive) { (Action) in
NSUserDefaults.standardUserDefaults().removeObjectForKey("pinnedLocation");
NSNotificationCenter.defaultCenter().postNotificationName("reloadData", object: nil);
self.map.removeAnnotations(self.map.annotations);
self.pinLocationButton.enabled = true;
}
}
这应该可以完成工作:)
这是面向对象编程的圆锥问题,如何通知对象某个事件发生了?
一篇关于该主题的好文章是 When to use Delegation, Notification, or Observation in iOS. (As you would expect, each of these three patterns have their pros and cons.) You could also "roll your own" solution by implementing some variation of the Observer Pattern。还有一些 "off-shelf" 解决方案以及 ReactiveCocoa 和 RxSwift(都在 github 上并且可以通过 cocoapods 获得)。
我觉得您是编程新手。因此,我建议您实施此处其他答案中显示的通知中心解决方案,然后使用 Key Value Observing 重新实施该解决方案,然后使用 Delegation 再次实施它。这样你就会了解所有这些重要的模式,并清楚地知道哪种模式最适合你的特定情况。如果您喜欢冒险,您也可以研究其中一种反应式解决方案……学习曲线更高,但它们是强大的工具,可以在许多不同的情况下使用。
在我的基本视图控制器上,我有一张地图,上面有用户的固定位置,然后将其存储到 NSUserdefaults
中。我还有一个删除选项,用户可以在其中删除 his/her 固定注释。该应用程序由选项卡控制器 运行 因此第一个选项卡是用户的固定位置,第二个选项卡是固定位置的详细视图。但是,当我从 first view controller
中删除注释时,旧位置仍然保留在 detailed view controller
。
有没有什么方法可以refresh/reload基于基础动作的细节视图控制器VC?
谢谢!
您可以使用 NSNotificationCenter
来实现。
基本上 NSNotificationCenter
保留对任何注册为观察者的对象的引用。通过该引用,它还可以跟踪对象需要什么样的通知。当对象发布通知时,中心通过向观察者发送带有该选择器的消息,将其传递给每个注册的观察者。
假设你有两个视图控制器
- 第一个视图控制器
- 第二个视图控制器
现在你想根据第二个视图中的某些操作在第一个视图控制器中执行一些操作 Controller.Then 在 FirstViewController 中你只需将此视图控制器注册为观察者并实现你想要处理的方法notification.From SecondViewController 你必须发送通知。
FirstViewController.m
在第一个视图控制器中,你必须像这样注册一个观察者。
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:@"reload_data" object:nil];
}
当您从 SecondViewController 收到一些通知时将调用此方法。
- (void)performAction {
NSLog(@"Do whatever you want to do");
}
SecondViewController.m
我从这里发送来自 SeconViewController 的通知。
- (IBAction)buttonClick:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"reload_data" object:self];
}
您可以为此使用 NSNotifications
。
在您的第一个视图控制器中,您实际上想要接收通知,而不是设置通知。
第二个视图控制器
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "resetData:", name: "reloadData", object: nil);
然后为您的选择器提供一个方法...
func resetData(notification:NSNotification) {
smallMapView.removeAnnotations(smallMapView.annotations);
smallMapView.showsUserLocation = true;
var location = locationManager.location;
var latitude = location.coordinate.latitude;
var longitude = location.coordinate.longitude;
var latDelta:CLLocationDegrees = 0.001;
var longDelta:CLLocationDegrees = 0.001;
var span: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta);
var overallLoc = CLLocationCoordinate2DMake(latitude, longitude);
var region:MKCoordinateRegion = MKCoordinateRegionMake(overallLoc, span);
self.smallMapView.setRegion(region, animated: true)
}
这将在用户当前位置的详细地图中重置图钉和中心(如果需要,您可以更改该功能)。
第一个视图控制器
我假设你在这里使用了 NSAlertView
...
@IBAction func trashButtonSelected(sender: AnyObject) {
// Remove from NSDefaults
// Show alertview
let alertController = UIAlertController(title: "Are you Sure?", message: "Do you wish to delete your pinned Location?", preferredStyle: .ActionSheet);
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (Action) in
// Cancel
}
let deleteButton = UIAlertAction(title: "Delete", style: .Destructive) { (Action) in
NSUserDefaults.standardUserDefaults().removeObjectForKey("pinnedLocation");
NSNotificationCenter.defaultCenter().postNotificationName("reloadData", object: nil);
self.map.removeAnnotations(self.map.annotations);
self.pinLocationButton.enabled = true;
}
}
这应该可以完成工作:)
这是面向对象编程的圆锥问题,如何通知对象某个事件发生了?
一篇关于该主题的好文章是 When to use Delegation, Notification, or Observation in iOS. (As you would expect, each of these three patterns have their pros and cons.) You could also "roll your own" solution by implementing some variation of the Observer Pattern。还有一些 "off-shelf" 解决方案以及 ReactiveCocoa 和 RxSwift(都在 github 上并且可以通过 cocoapods 获得)。
我觉得您是编程新手。因此,我建议您实施此处其他答案中显示的通知中心解决方案,然后使用 Key Value Observing 重新实施该解决方案,然后使用 Delegation 再次实施它。这样你就会了解所有这些重要的模式,并清楚地知道哪种模式最适合你的特定情况。如果您喜欢冒险,您也可以研究其中一种反应式解决方案……学习曲线更高,但它们是强大的工具,可以在许多不同的情况下使用。