首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据基视图中的操作刷新其他视图控制器

如何根据基视图中的操作刷新其他视图控制器
EN

Stack Overflow用户
提问于 2015-07-18 19:25:35
回答 3查看 1.3K关注 0票数 3

在我的基本视图控制器上,我有一个地图,上面有用户的固定位置,然后将其存储到NSUserdefaults中。我还有一个delete选项,用户可以在这里删除他/她固定的注释。该应用程序由一个选项卡控制器运行,因此第一个选项卡是用户的固定位置,第二个选项卡是固定位置的详细视图。但是,当我从first view controller中删除注释时,旧位置仍然保留在detailed view controller上。

我是否可以根据基本VC的操作刷新/重新加载详细视图控制器?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-19 00:22:04

为此您可以使用NSNotifications

在第一个视图控制器中,您实际上希望接收通知,而不是设置通知。

第二视图控制器

代码语言:javascript
复制
override func viewDidLoad() {

    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "resetData:", name: "reloadData", object: nil);

然后给你的选择器找个方法。

代码语言:javascript
复制
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 .

代码语言:javascript
复制
@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;
    }
}

这应该能做好以下工作:)

票数 2
EN

Stack Overflow用户

发布于 2015-07-18 19:52:26

您可以使用NSNotificationCenter来实现这一点。

基本上,NSNotificationCenter保存对注册为观察者的任何对象的引用。使用该引用,它还跟踪对象需要什么样的通知。当对象发布通知时,中心通过向观察者发送带有该选择器的消息将通知传递给每个注册的观察者。

假设您有两个视图控制器

  1. 第一视图控制器
  2. 第二视图控制器

现在,您想要在第一视图控制器中执行一些操作,基于FirstViewController中的第二视图控制器中的某些操作,只需将该视图控制器注册为观察者,并实现要处理必须发送通知的notification.From SecondViewController的方法。

FirstViewController.m

在第一视图控制器中,您必须注册这样的观察者。

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction) name:@"reload_data" object:nil];
}

这将在您从SecondViewController获得一些通知时被调用。

代码语言:javascript
复制
- (void)performAction {
    NSLog(@"Do whatever you want to do");
}

SecondViewController.m

从这里开始,我将从SeconViewController发送通知。

代码语言:javascript
复制
- (IBAction)buttonClick:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reload_data" object:self];

}

票数 3
EN

Stack Overflow用户

发布于 2015-07-19 01:43:44

这是面向对象编程的圆锥形问题,如何通知对象某些事件的发生?

关于这一主题的一篇好文章是何时在iOS中使用委托、通知或观察。(正如您所预期的,这三种模式各有优缺点。)您还可以通过实现观测器模式的一些变体来“滚动您自己的”解决方案。还有一些“现成”的解决方案,比如ReactiveCocoa和RxSwift (都在github上,也可以通过cocoapods获得)。

我觉得你对编程有点陌生。因此,我建议您实现在这里显示在其他答案中的Notification解决方案,然后使用键值观察重新实现该解决方案,然后使用委托再次实现它。这样,你就能了解所有这些重要的模式,并对哪种模式在你的特定情况下最合适有一个好的想法。如果你觉得冒险,你也可以调查其中一个反应解决方案..。学习曲线更高,但它们是强大的工具,可以在许多不同的情况下使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31494757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档