如果从其他视图控制器按回,则重新加载而不重新加载。迅速

Pak*_*ung 6 back-button viewdidload viewdidappear ios swift

前三个答案可以解决我的问题。很难选择哪一个是最好的。因此,我只选择第一个回答我问题的人。对不起,业余爱好者和iOS爱好者。谢谢您的帮助。我很感激。

在此处输入图片说明

ViewController 1具有一个表格视图。

我的问题是,仅当我从视图控制器2单击返回时,才如何重新加载表视图;如果我从视图控制器3单击返回,则不重新加载表视图。

现在,我的后退按钮代码是

@IBAction func backButtonTapped(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

在视图控制器1中。我知道将从视图控制器2或3重新加载表视图。

override func viewDidAppear(animated: Bool) {
    loadTable()
}
Run Code Online (Sandbox Code Playgroud)

我试图将loadTable()放在viewDidLoad中,并尝试在视图控制器2中为后退按钮编写以下代码。但是,它不起作用。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("UserHomePageViewController") as! UserHomePageViewController
controller.viewDidLoad()
Run Code Online (Sandbox Code Playgroud)

有什么建议我该怎么办?谢谢您的帮助。

编辑:

我认为这是一种更简单的方法,但是仍然无法如我所愿。我猜这是因为viewDidAppear是在调用reloadTableBool之前执行的。正确?有什么办法可以解决?谢谢。您的帮助将不胜感激。

class 2ViewController
@IBAction func backButtonTapped(sender: AnyObject) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewControllerWithIdentifier("1ViewController") as! 1ViewController
        print("viewcontroller2 before call: \(controller.reloadTableBool)")
        controller.reloadTableBool = false
        print("viewcontroller2 after call: \(controller.reloadTableBool)")
        self.dismissViewControllerAnimated(true, completion: nil)
    }
class 1ViewController
var reloadTableBool = true
override func viewDidAppear(animated: Bool) {
    print("viewcontroller1: \(reloadTableBool)")
    if reloadTableBool == true {
        loadTable()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我单击视图控制器2时,它会打印

viewcontroller2 before call: true
viewcontroller2 after call: false
viewcontroller1: true
Run Code Online (Sandbox Code Playgroud)

ama*_*our 2

如果显示vc2是由vc1执行的,并且总是肯定会使vc1中的数据无效,您可以执行以下操作:

  • needsReload向 vc1添加布尔实例变量
  • awakeFromNib每当您显示 vc2 时(以及实例化 vc1 时,例如来自故事板时),请将其设置为 true
  • 仅执行 if needReload 为 true 的内容loadTable(也许将此逻辑重构为loadTableIfNeeded
  • 不要忘记needsReload最后设置为 falseloadTableIfNeeded

这种失效模式在 UIKit 中随处可见,例如 UIView setNeedsLayout/ layoutIfNeeded。优点是,即使多个事件导致数据无效,它也只会在您需要时才会真正刷新。

在您的情况下,它还有一个额外的优点,即保留 vc1 中包含的逻辑,并且不会在 VC 之间创建不必要的耦合,这总是好的。

---更新:示例实现(ObjC,但你会明白的)

你只需要在 VC1 中处理这个,忘记 VC2 中的所有后退按钮。此实现将在 VC2 出现后立即将 VC1 标记为重新加载,但实际上仅在 VC2 关闭时在 viewWillAppear 上重新加载。

---更新 2:添加了基于委托回调的条件重新加载

请注意,_needsReload现在是在委托回调中设置的,而不是在首次呈现 VC2 时设置的。相反,我们将 VC1 设置为 VC2 的委托。(_needsReload使用这个方法实际上是不需要逻辑的,留作参考)

//VC2: add a delegate to the interface

@class VC2;

@protocol VC2Delegate
- (void) viewController:(VC2*)myVC2 didFinishEditingWithChanges:(BOOL)hasChanges;
@end

@interface VC2
@property (nonatomic, weak) id<VC2Delegate> delegate
@end

@implementation VC2 

- (IBAction) finishWithChanges
{
   [self.delegate viewController:self didFinishEditingWithChanges:YES];
}

- (IBAction) finishWithoutChanges
{
   [self.delegate viewController:self didFinishEditingWithChanges:NO];
}

@end

//VC1: implement the VC2Delegate protocol

@interface VC1 () <VC2Delegate>
@end

@implementation VC1
{
   BOOL _needsReload
}

- (void) awakeFromNib 
{
   //adding this for completeness but the way you did it in Swift (at init) is correct
   [super awakeFromNib];
   _needsReload = YES;
}

- (void) viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
   [self reloadTableIfNeeded];
}

- (IBAction) displayVC2
{
   VC2* myVC2 = ... //instanciate your VC2 here
   myVC2.delegate = self; //set as the delegate of VC2
   [self presentViewController:myVC2 animated:YES completion:nil];
}

- (void) viewController:(VC2*)myVC2 didFinishEditingWithChanges:(BOOL)hasChanges
{
   _needsReload = hasChanges;
   [self reloadTableIfNeeded];
}

- (void) reloadTableIfNeeded
{
   if (_needsReload) {
      [self.tableView reloadData];
      _needsReload = NO;
   }
}

@end
Run Code Online (Sandbox Code Playgroud)