ios - 关闭 ModalViewController 后刷新父 ViewController

标签 ios objective-c uiviewcontroller nsnotificationcenter presentviewcontroller

在我的 iOS 应用程序中,用户可以从列表中选择一个图像,然后他们会看到一个包含图像和删除图像选项的模式。如果用户选择删除图像,她将返回到包含图像列表的原始 viewController。然后我需要刷新原始 ViewController 以考虑删除的图像。

当图像被删除到父 View Controller 时,我尝试使用 NSNotificationCenter 进行广播。但是,似乎从未收到广播。

还有其他方法吗

  1. 在模式消失后将数据发送回父 ViewController,并且
  2. 检测模态何时从父 ViewController 中消失?

(我尝试按照概述的示例 here 进行操作,但它似乎没有用)

下面是我的代码:

EditStepViewController(原始 View Controller ):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MediaPreviewViewController *mediaPreviewVC = (MediaPreviewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MediaPreviewViewController"];
mediaPreviewVC.selectedImageURL = [NSString stringWithFormat:@"%@",gestureRecognizer.view.tag];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mediaPreviewVC];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didDismissMediaPreview)
                                             name:@"MediaPreviewDismissed"
                                           object:nil];
[self presentViewController:navigationController animated:YES completion:nil];

MediaPreviewViewController(第二个 ViewController):

 ...
 [self deleteImage];
 [[NSNotificationCenter defaultCenter] postNotificationName:@"MediaPreviewDismissed" object:nil userInfo:nil];
 [self dismissViewControllerAnimated:YES completion:^(){
   NSLog(@"dismissed controller");
  }];

然后,回到 EditStepViewController:

-(void)didDismissMediaPreview{
    NSLog(@"dismissed media preview"); // this is never logged!
    [self.view setNeedsDisplay]; // refresh view to account for deleted image
}

预先感谢您的帮助!

最佳答案

在我的例子中,我通常在这里使用 block 。

例如你有ParentViewController.h

@interface ParentViewController : UIViewController
@end

实现ParentViewController.m

// INCLUDE HERE THE MODAL CONTROLLER TO HAVE ACCESS TO ITS PUBLIC PROPERTY
#import ModalViewController.h

@implementation ParentViewController

// implement your modal dismiss block here
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   // DEFINE HERE THE CALLBACK FUNCTION
   // 1. get the model view controller
   ModalViewController *mvc = [segue destinationViewController];

   // 2. Your code after the modal view dismisses
   mvc.onDismiss = ^(UIViewController *sender, NSObject *objectFromModalViewController)
   {
       // Do your stuff after dismissing the modal view controller
       .
       .
       .
   }
} 
@end

并且,ModalViewController.h

@interface ModalViewController : UIViewController

// call back function, a block
@property (nonatomic, strong) void (^onDismiss)(UIViewController *sender, NSObject *objectYouWantToPassBackToParentController)
@end

ModalViewController.m

@implementation ModalViewController

.
.
.

// your dismiss function say
- (IBAction)dismissViewController:(id)sender
{
   ... 

   [self deleteImage];

   [self dismissViewControllerAnimated:YES completion:^
   {
      // MAKE THIS CALL
      self.onDismiss(self, theOjectYouWantToPassBackToParentVC);
   }];
}
@end

关于ios - 关闭 ModalViewController 后刷新父 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25616250/

相关文章:

android - 使用 Apache Flex SDK4.8.0、AIR3.4 和 FDT5.6.2 编译生成 "unable to open ' {airHome}/frameworks/libs/air/airglobal.swc'"

ios - 如何向右滑动以在 Swift 3 中显示新的 View Controller ?

ios - AF网络 : Send image from file

ios - 更新 View 的框架保持约束

swift - 使用 UITableView iOS swift 以编程方式按下 UIViewController 的后退按钮

ios - 何时获得正确的帧大小

ios - 如何从关系实体中进行简单的获取? swift

iphone - 上传图片时如何在iphone中显示进度条

ios - 如何覆盖 setObject : forKey: method (in Foundation Framework)

ios - SwiftUI - NavigationLink View 中的 NavigationBar 快速显示然后消失