如何根据基本视图

时间:2015-07-18 19:25:36

标签: ios swift viewcontroller

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

无论如何我可以根据基础VC的动作刷新/重新加载详细视图控制器吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用NSNotificationCenter来实现此目标。

基本上NSNotificationCenter保留对注册为观察者的任何对象的引用。通过该引用,它还可以跟踪对象想要的通知类型。当对象发布通知时,中心通过向观察者发送带有该选择器的消息将其传递给每个注册的观察者。

假设您有两个View Controller

  1. 第一视图控制器
  2. 第二视图控制器
  3. 现在你想根据Second View Controller中的一些动作在First View Controller中执行一些动作。然后在FirstViewController中你只需要将这个视图控制器注册为观察者并实现你想要处理通知的方法。从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];
    

    }

答案 1 :(得分:2)

您可以使用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;
    }
}

这应该做的工作:)

答案 2 :(得分:1)

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

关于这个主题的一篇好文章是When to use Delegation, Notification, or Observation in iOS。 (正如您所料,这三种模式中的每一种都有其优点和缺点。)您也可以“自己动手”。通过实现Observer Pattern的一些变体来解决问题。还有几个"现成的"解决方案以及ReactiveCocoa和RxSwift(两者都在github上,可通过cocoapods获得)。

我觉得你对编程很陌生。因此,我建议您在此处实现其他答案中显示的Notification Center解决方案,然后使用Key Value Observing重新实现解决方案,然后使用Delegation再次实现它。通过这种方式,您将了解所有这些重要模式,并在您的特定情况下最好地了解哪种模式最佳。如果你喜欢冒险,你也可以研究一种Reactive解决方案......学习曲线更高,但它们是可以在许多不同情况下使用的强大工具。