2

我在 UIView 中嵌入了一个 UITableView,但我不知道如何更新。当我使用嵌入在 UIView 中的 UITableView 来到这个页面时,有一个按钮在按下时会显示一个 modalForm。有一个文本字段,用户可以在其中输入名称,然后按下另一个按钮来“创建”对象、关闭 modalForm 并更新应用程序数据。但是,我不确定如何刷新我的 UITableView 数据......有没有办法告诉 UITableView 在 modalForm 视图被关闭时刷新?

编辑:我知道我需要发送此消息[tableView reloadData];才能刷新,但我想知道我可以把它放在哪里,以便在解除 modalForm 时调用它?

4

6 回答 6

2

在呈现和关闭模式的视图控制器中,您应该调用该 dismissViewControllerAnimated:completion方法来关闭模式。模态不应自行消失。您可以使用完成块来执行您希望在模式完成关闭时执行的任何代码。下面的例子。

[self dismissViewControllerAnimated:YES completion:^{
    //this code here will execute when modal is done being dismissed
    [_tableView reloadData];
}];

当然不要忘记避免在块中强烈捕获自我。

如果您最终使模态消失,您将需要一个委托方法,以便模态可以与呈现视图控制器进行通信,或者由模态发送并由呈现视图控制器捕获的通知,或者您可以viewWillAppear:在呈现视图控制器。每次视图即将出现时都会触发此方法。这意味着第一次以及在模态被解除并且即将显示它所呈现的视图之后。

-------------------------------------------------- --------------------------------------

下面是编写您自己的协议并使用它的示例。

MyModalViewController.h

@protocol MyModalViewControllerDelegate <NSObject>

//if you don't need to send any data
- (void)myModalDidFinishDismissing;

//if you need to send data
- (void)myModalDidFinishDismissingWithData:(YourType *)yourData

@end

@interface MyModalViewController : UIViewController

@property (weak) id <MyModalViewControllerDelegate> delegate;

//place the rest of your properties and public methods here

@end

无论您想在 MyModalViewController 实现文件中的哪个位置调用您选择的委托方法。不过,您应该首先确保您的委托确实响应了选择器。MyModalViewController.m if ( [self.delegate respondsToSelector:@selector(myModalDidFinishDismissing)] ) [self.delegate myModalDidFinishDismissing];

在呈现模态的视图控制器中,您需要在头文件中声明您符合协议,您需要将模态的委托设置为视图控制器,并确保您实际实现了您打算使用的委托方法.

我的PresentingViewController.h

@interface MyPresentingViewController : UIViewController <MyModalViewControllerDelegate>

我的PresentingViewController.m

myModal.delegate = self;
- (void)myModalDidFinishDismissing {
    //do something
    [tableView reloadData];
}
于 2013-10-01T17:22:45.527 回答
1

我希望我有参考,但几年前我看到 Apple 的一个说明,说模态视图永远不应该自我关闭。相反,您在呈现视图控制器上调用方法。在此方法中,演示者关闭模式视图控制器。通常我会在我的 UIViewControllers 上放置一个类别:

@interface UIViewController (Extension)
-(void)simpleDismissAnimated:(BOOL)animated;
@end
@implementation UIViewController (Extension)
-(void)simpleDismissAnimated:(BOOL)animated {
[self dismissViewControllerAnimated:animated completion:nil];
}

要么将它包含在所有视图控制器子类中,要么包含在您的 pch 文件中。

所以让你的模态视图控制器调用:

[self.presentingViewController simpleDismissAnimated:YES];

然后在您的呈现视图控制器中,将 simpleDismissAnimated: 的实现覆盖为:

-(void)simpleDismissAnimated:(BOOL)animated {
[_tableView reloadData];
[self dismissViewControllerAnimated:animated completion:nil;
}

那应该照顾它。

于 2013-10-01T01:44:09.597 回答
1

您可以在模态表单类中有一个委托变量。当您关闭模态表单时,您可以调用诸如 [delegate performSelector:@selector(modalFormClosed)] 之类的调用 [tableView reloadData]。

@interface ModalForm : UIViewController
@property (nonatomic, weak) id delegate;
@end

@implementation ModalForm
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.delegate performSelector:@selector(modalFormClosed)];
}
@end

在您使用 ModalForm 的课程中​​:

myModalForm.delegate = self;

并确保你也有 modalFormClosed 方法:

- (void)modalFormClosed {
    [self.tableView reloadData];
}

或者,当您的模态表单消失时,您可以发送 NSNotification(查看 NSNotificationCenter)。

于 2013-10-01T00:57:16.267 回答
0

我有同样的问题。ReloadData 对我不起作用。我解决了它,所以我做了这样的新方法:

- (void)insertNewString:(NSString *)text{
        if (!_yourArrayWithData) {
            _yourArrayWithData = [[NSMutableArray alloc] init];
        }
        [_yourArrayWithData insertObject:text atIndex:0];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }

当我想在 tableView 中添加一些东西时,我使用具有如下操作的按钮:

- (IBAction)SaveNewPhrase:(id)sender {        
NSString *mainText = _NewPhraseTextView.text;   //I take nsstring from textView

if([mainText isEqual:@""]){
    return;
}else{
    NSMutableArray *contentFile = [NSArray arrayWithContentsOfFile:docPathContents()];
    NSMutableArray *copyContentFile = [[NSMutableArray alloc] init];

          //save array with new item        
    [copyContentFile addObject:mainText];
    [copyContentFile addObjectsFromArray:contentFile];
    [copyContentFile writeToFile:docPathContents() atomically:YES];   

    [self insertNewString:mainText];      //refresh tableView

    [_NewPhraseTextView resignFirstResponder];
}}

我希望,它会有所帮助。

于 2014-08-24T00:56:59.867 回答
0

您可以尝试[tableView reloadData]在 tableView 所在的位置放入 viewWillAppear 方法。

于 2013-10-01T00:22:54.523 回答
0

试试这条线:

 [self.tableView reloadData];
于 2013-09-30T23:00:14.320 回答